3.16結合時區的日期操作
阿新 • • 發佈:2022-03-16
問題:
解決方案:
對幾乎所有涉及到時區的問題,你都應該使用pytz模組,這個包提供了Olson時區資料庫,它是時區的事實上的標準,在很多語言和作業系統裡面都可以找到,
pytz模組一個主要用途是將datetime庫建立的簡單日期物件本地化,比如,下面如果表示一個芝加哥時間的示例:
from datetime import datetime from pytz import timezone d = datetime(2022, 12, 21, 9, 12, 0) print(d) # ->2022-12-21 09:12:00 central=timezone('US/Central') loc_d=central.localize(d) print(loc_d) # ->2022-12-21 09:12:00-06:00
一旦日期被本地化了,它就可以以轉換為其他時區的時間了,為了得到班加羅爾對應的時間,你可以這樣做:
bang_d=loc_d.astimezone(timezone('Asia/Kolkata'))
print(bang_d)# ->2022-12-21 20:42:00+05:30
如果你打算在本地化日期上執行計算,你需要特別注意夏令時轉換和其他細節。比如,2022年,美國標準夏令時間開始於本地時間3月13日凌晨2:00(在那時,時間向前跳過一小時)。如果你正在執行本地計算,你會得到一個錯誤。比如:
d = datetime(2022, 12, 21, 9, 12) central=timezone('US/Central') loc_d=central.localize(d) later=loc_d+timedelta(minutes=30) print(loc_d) # ->2022-12-21 09:12:00-06:00 print(later)# ->2022-12-21 09:42:00-06:00
討論:
為了不讓你被這些東西弄的暈頭轉向,處理本地化日期的通常的策略先將所有日期轉換為UTC時間,並用它來執行所有的中間儲存和操作。比如:
print(loc_d) # ->2022-12-21 09:12:00-06:00
utc_d = loc_d.astimezone(pytz.utc)
print(utc_d) # ->2022-12-21 15:12:00+00:00
一旦轉換為UTC,你就不用去擔心跟夏令營時相關的問題了。因此,你可以跟之前一樣放心的執行常見的日期計算。當你想將輸出變成本地時間的時候,使用合適的時區去轉換下就行了。比如:
later_utc=utc_d+timedelta(minutes=30) print(later_utc.astimezone(central)) # ->2022-12-21 09:42:00-06:00
當設計到時區操作的時候,有個問題就是我們如何得到時區的名稱,比如,在這個例子中,我們如何知道‘Asia/Kolkata’就是印度對應的時區名呢?為了 查詢,可以使用ISO 3166國家程式碼作為關鍵字去查閱字典pytz.country_timezone。比如:
print(pytz.country_timezones['IN']) # ->['Asia/Kolkata']