W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你有一個(gè)安排在2012年9月21日早上9:30的電話會(huì)議,地點(diǎn)在芝加哥。而你的朋友在印度的班加羅爾,那么他應(yīng)該在當(dāng)?shù)貢r(shí)間幾點(diǎn)參加這個(gè)會(huì)議呢?
對(duì)幾乎所有涉及到時(shí)區(qū)的問題,你都應(yīng)該使用 pytz
模塊。這個(gè)包提供了Olson時(shí)區(qū)數(shù)據(jù)庫,它是時(shí)區(qū)信息的事實(shí)上的標(biāo)準(zhǔn),在很多語言和操作系統(tǒng)里面都可以找到。
pytz模塊一個(gè)主要用途是將 datetime
庫創(chuàng)建的簡(jiǎn)單日期對(duì)象本地化。比如,下面如何表示一個(gè)芝加哥時(shí)間的示例:
>>> from datetime import datetime
>>> from pytz import timezone
>>> d = datetime(2012, 12, 21, 9, 30, 0)
>>> print(d)
2012-12-21 09:30:00
>>>
>>> # Localize the date for Chicago
>>> central = timezone('US/Central')
>>> loc_d = central.localize(d)
>>> print(loc_d)
2012-12-21 09:30:00-06:00
>>>
一旦日期被本地化了, 它就可以轉(zhuǎn)換為其他時(shí)區(qū)的時(shí)間了。為了得到班加羅爾對(duì)應(yīng)的時(shí)間,你可以這樣做:
>>> # Convert to Bangalore time
>>> bang_d = loc_d.astimezone(timezone('Asia/Kolkata'))
>>> print(bang_d)
2012-12-21 21:00:00+05:30
>>>
如果你打算在本地化日期上執(zhí)行計(jì)算,你需要特別注意夏令時(shí)轉(zhuǎn)換和其他細(xì)節(jié)。比如,在2013年,美國標(biāo)準(zhǔn)夏令時(shí)時(shí)間開始于本地時(shí)間3月13日凌晨2:00(在那時(shí),時(shí)間向前跳過一小時(shí))。如果你正在執(zhí)行本地計(jì)算,你會(huì)得到一個(gè)錯(cuò)誤。比如:
>>> d = datetime(2013, 3, 10, 1, 45)
>>> loc_d = central.localize(d)
>>> print(loc_d)
2013-03-10 01:45:00-06:00
>>> later = loc_d + timedelta(minutes=30)
>>> print(later)
2013-03-10 02:15:00-06:00 # WRONG! WRONG!
>>>
結(jié)果錯(cuò)誤是因?yàn)樗]有考慮在本地時(shí)間中有一小時(shí)的跳躍。為了修正這個(gè)錯(cuò)誤,可以使用時(shí)區(qū)對(duì)象 normalize()
方法。比如:
>>> from datetime import timedelta
>>> later = central.normalize(loc_d + timedelta(minutes=30))
>>> print(later)
2013-03-10 03:15:00-05:00
>>>
為了不讓你被這些東東弄的暈頭轉(zhuǎn)向,處理本地化日期的通常的策略先將所有日期轉(zhuǎn)換為UTC時(shí)間,并用它來執(zhí)行所有的中間存儲(chǔ)和操作。比如:
>>> print(loc_d)
2013-03-10 01:45:00-06:00
>>> utc_d = loc_d.astimezone(pytz.utc)
>>> print(utc_d)
2013-03-10 07:45:00+00:00
>>>
一旦轉(zhuǎn)換為UTC,你就不用去擔(dān)心跟夏令時(shí)相關(guān)的問題了。因此,你可以跟之前一樣放心的執(zhí)行常見的日期計(jì)算。當(dāng)你想將輸出變?yōu)楸镜貢r(shí)間的時(shí)候,使用合適的時(shí)區(qū)去轉(zhuǎn)換下就行了。比如:
>>> later_utc = utc_d + timedelta(minutes=30)
>>> print(later_utc.astimezone(central))
2013-03-10 03:15:00-05:00
>>>
當(dāng)涉及到時(shí)區(qū)操作的時(shí)候,有個(gè)問題就是我們?nèi)绾蔚玫綍r(shí)區(qū)的名稱。比如,在這個(gè)例子中,我們?nèi)绾沃馈癆sia/Kolkata”就是印度對(duì)應(yīng)的時(shí)區(qū)名呢?為了查找,可以使用ISO 3166國家代碼作為關(guān)鍵字去查閱字典 pytz.country_timezones
。比如:
>>> pytz.country_timezones['IN']
['Asia/Kolkata']
>>>
注:當(dāng)你閱讀到這里的時(shí)候,有可能pytz模塊以及不再建議使用了,因?yàn)镻EP431提出了更先進(jìn)的時(shí)區(qū)支持。但是這里談到的很多問題還是有參考價(jià)值的(比如使用UTC日期的建議等)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: