yyyymmdd - python timedelta minutes
從Python日期/時間獲取“下午2:35”而不是“02:35 PM”? (6)
我對Python仍然有點慢,所以除了文檔中顯而易見的等等之外,我還沒有弄明白這一點。
我曾經使用過Django,他們通過模板標籤添加了一些日期時間格式化選項,但是在常規python代碼中如何獲得沒有前導零的12小時小時 ?
有這麼簡單的方法嗎? 我正在查看“strftime()”的2.5和2.6文檔,並且在這種情況下似乎沒有格式化選項。
我應該使用其他東西嗎?
隨意添加任何其他時間格式提示,這些提示在文檔中並不明顯。 =)
Python的strftime()
僅保證支持C89的格式代碼(參見list )。
其他標准定義了有用的附加格式代碼(請參閱strftime()
的Linux手冊頁 )。 對於這個問題,相關的附加代碼是:
-
%l
- 小時(12小時制)作為十進制數(範圍1到12)。 -
%P
- 與%p
類似但以小寫形式:“am”或“pm”或當前語言環境的相應字符串。
我喜歡在strftime()
周圍使用包裝函數來實現其他代碼:
def extendedStrftime(dt, format):
day = dt.strftime('%d').lstrip('0')
hour = dt.strftime('%I').lstrip('0')
ampm = dt.strftime('%p').lower()
format = format.replace('%e', day)
format = format.replace('%l', hour)
format = format.replace('%P', ampm)
return dt.strftime(format)
要獲得“2:35 pm”格式的輸出:
extendedStrftime(dt, '%l:%M%P')
想要在沒有前導零的情況下格式化日期也很常見,可以使用附加代碼%e
來完成:
extendedStrftime(dt, '%e %b %Y') # "1 Jan 2015"
datetime.time
對象顯示hour
, minute
和second
字段。 用這些來製作自己的格式非常簡單。 像這樣的東西:
return "%d:%02d %s" % (foo.hour % 12 + 0 if foo.hour % 12 else 12, #ugh
foo.minute,
"pm" if foo.hour >= 12 else "am")
我用過的一點點黑客:
# a time object
mytime = time(hour=time_hour, minute=time_minute)
# return a time as a string without a leading zero in hours.
return "%s:%s" % (mytime.hour, mytime.strftime("%M"))
我知道它很便宜,但你可以丟棄第一個字符,如果它是零:)
雖然我不喜歡Mike DeSimone的回答 ,但出於投票目的,我認為這可能是值得的貢獻......
Django項目在django / utils / dateformat.py(trunk)中包含一個“PHP Compatible”日期格式化類。 它像這樣使用(shell示例):
>>> import datetime
>>> from django.utils.dateformat import DateFormat
>>> d = datetime.datetime.now()
>>> df = DateFormat(d)
>>> df.format('g:ia') # Format for Hour-no-leading-0, minutes, lowercase 'AM/PM'
u'9:10a.m.'
它符合這裡的要求,可能值得包含在您的項目中。 有了這個,我會說你應該驗證許可證允許使用......任何澄清的評論都是受歡迎的。
沒有任何內置於datetime
內容。 你需要使用類似的東西:
datetime.time(1).strftime('%I:%M%p').lstrip('0')
附錄
正如@naktinis指出的那樣,這是針對使用這個特定的strftime
參數而量身定制的。 不幸的是,如果strftime
參數的內容未知或未指定(例如外部參數),則沒有通用的解決方案,因為它變成了“我的意思,不是我說的”問題。
因此,鑑於您必須知道strftime
參數中的內容,在更複雜的情況下,您可以將其解析為部分:
tval = datetime.time(1)
tval_str = (tval.strftime('%A, %B ') + tval.strftime('%d').lstrip('0')
+ tval.strftime(' %Y, ') + tval.strftime('%I:%M').lstrip('0')
+ tval.strftime('%p').lower())
或者使用re
模塊:
tval = datetime.time(1)
tval_str = re.sub(r"^0|(?<=\s)0", "",
re.sub(r"(?<=[0-9])[AP]M", lambda m: m.group().lower(),
tval.strftime('%A, %B %d %Y, %I:%M%p')))
也就是說,請記住,如果"%p"
術語為您提供大寫字母,則可能是因為用戶將其區域設置設置為以這種方式工作,並且通過更改大小寫,您將覆蓋用戶首選項,這有時會導致錯誤報告。 此外,用戶可能想要除“am”或“pm”之外的其他內容,例如“am”和“pm”。 另請注意,這些對於不同的語言環境是不同的(例如, en_US
語言環境為%p
提供AM
或PM
,但de_DE
給出am
或pm
),並且您可能沒有在您假設的編碼中獲得字符。
從strftime行為的文檔 :
由於格式取決於當前的區域設置,因此在對輸出值進行假設時應小心。 字段順序會有所不同(例如,“月/日/年”與“日/月/年”),輸出可能包含使用區域設置的默認編碼編碼的Unicode字符(例如,如果當前區域設置為
js_JP
,則默認編碼可以是eucJP
,SJIS
或utf-8
任何一個;使用locale.getlocale()
來確定當前語言環境的編碼)。
因此,簡而言之,如果您認為需要覆蓋區域設置,請確保您有充足的理由,因此您不必最終創建新的錯誤。