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對象顯示hourminutesecond字段。 用這些來製作自己的格式非常簡單。 像這樣的東西:

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提供AMPM ,但de_DE給出ampm ),並且您可能沒有在您假設的編碼中獲得字符。

strftime行為文檔

由於格式取決於當前的區域設置,因此在對輸出值進行假設時應小心。 字段順序會有所不同(例如,“月/日/年”與“日/月/年”),輸出可能包含使用區域設置的默認編碼編碼的Unicode字符(例如,如果當前區域設置為js_JP ,則默認編碼可以是eucJPSJISutf-8任何一個;使用locale.getlocale()來確定當前語言環境的編碼)。

因此,簡而言之,如果您認為需要覆蓋區域設置,請確保您有充足的理由,因此您不必最終創建新的錯誤。





formatting