1. 程式人生 > 其它 >3.16結合時區的日期操作

3.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']