zoneinfo --- IANA 時區支援¶
在 3.9 版被加入.
原始碼:Lib/zoneinfo
zoneinfo 模組提供了一個具體的時區實作,以支援 PEP 615 中最初指定的 IANA 時區資料庫。預設情況下,如果可用,zoneinfo 會使用系統的時區資料;如果沒有可用的系統時區資料,該函式庫將轉而使用 PyPI 上可用的第一方 tzdata 套件。
也參考
可用性: not WASI.
此模組在 WebAssembly 平台上不起作用或無法使用。更多資訊請參閱 WebAssembly 平台。
使用 ZoneInfo¶
ZoneInfo 是 datetime.tzinfo 抽象基底類別的一個具體實作,旨在透過建構函式、datetime.replace 方法或 datetime.astimezone 方法附加到 tzinfo:
>>> from zoneinfo import ZoneInfo
>>> import datetime as dt
>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00
>>> when.tzname()
'PDT'
以此方式建構的 Datetime 物件與 datetime 運算相容,並能處理日光節約時間轉換而無需進一步干預:
>>> when_add = when + dt.timedelta(days=1)
>>> print(when_add)
2020-11-01 12:00:00-08:00
>>> when_add.tzname()
'PST'
這些時區也支援 PEP 495 中引入的 fold 屬性。在會引發時間模糊的時差轉換期間(例如日光節約時間到標準時間的轉換),當 fold=0 時,會使用轉換前的時差,而當 fold=1 時,會使用轉換後的時差,例如:
>>> when = dt.datetime(2020, 11, 1, 1, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-11-01 01:00:00-07:00
>>> print(when.replace(fold=1))
2020-11-01 01:00:00-08:00
當從另一個時區轉換時,fold 將被設定為正確的值:
>>> LOS_ANGELES = ZoneInfo("America/Los_Angeles")
>>> when_utc = dt.datetime(2020, 11, 1, 8, tzinfo=dt.timezone.utc)
>>> # 在 PDT 轉換為 PST 之前
>>> print(when_utc.astimezone(LOS_ANGELES))
2020-11-01 01:00:00-07:00
>>> # 在 PDT 轉換為 PST 之後
>>> print((when_utc + dt.timedelta(hours=1)).astimezone(LOS_ANGELES))
2020-11-01 01:00:00-08:00
資料來源¶
zoneinfo 模組不直接提供時區資料,而是從系統時區資料庫或可用的第一方 PyPI 套件 tzdata 中提取時區資訊。某些系統,特別是 Windows 系統,沒有可用的 IANA 資料庫,因此對於需要時區資料且目標為跨平台相容性的專案,建議宣告對 tzdata 的依賴。如果系統資料和 tzdata 都不可用,所有對 ZoneInfo 的呼叫都將引發 ZoneInfoNotFoundError 例外。
設定資料來源¶
當呼叫 ZoneInfo(key) 時,建構函式會先在 TZPATH 中指定的目錄中搜尋符合 key 的檔案,如果失敗,則在 tzdata 套件中尋找符合的項目。此行為可以透過三種方式設定:
編譯時期設定¶
預設的 TZPATH 包含時區資料庫的幾個常見部署位置(Windows 除外,因為 Windows 上沒有時區資料的「眾所周知」位置)。在 POSIX 系統上,下游發行者和從原始碼建置 Python 且知道其系統時區資料部署位置的人,可以透過指定編譯時期選項 TZPATH(或更有可能的是使用 configure 旗標 --with-tzpath)來變更預設時區路徑,它應該是一個由 os.pathsep 分隔的字串。
在所有平台上,設定的值可以透過 sysconfig.get_config_var() 中的 TZPATH 鍵取得。
環境設定¶
在初始化 TZPATH 時(無論是在引入時,或是在呼叫不帶引數的 reset_tzpath() 時),如果環境變數 PYTHONTZPATH 存在,zoneinfo 模組將使用它來設定搜尋路徑。
- PYTHONTZPATH¶
這是一個由
os.pathsep分隔的字串,包含要使用的時區搜尋路徑。它必須只包含絕對路徑,而非相對路徑。在PYTHONTZPATH中指定的相對路徑元件將不會被使用,但除此之外,指定相對路徑時的行為是實作定義的;CPython 將引發InvalidTZPathWarning,但其他實作可以自由地靜默忽略錯誤的元件或引發例外。
要讓系統忽略系統資料並改用 tzdata 套件,請設定 PYTHONTZPATH=""。
Runtime 設定¶
TZ 搜尋路徑也可以在 Runtime 使用 reset_tzpath() 函式進行設定。這通常不是一個建議的操作,儘管在需要使用特定時區路徑(或需要停用對系統時區的存取)的測試函式中使用它是合理的。
ZoneInfo 類別¶
- class zoneinfo.ZoneInfo(key)¶
一個具體的
datetime.tzinfo子類別,代表由字串key指定的 IANA 時區。對主要建構函式的呼叫將總是回傳比較結果相同的物件;換句話說,除非透過ZoneInfo.clear_cache()使快取失效,否則對於所有key的值,以下斷言將永遠為真:a = ZoneInfo(key) b = ZoneInfo(key) assert a is b
key必須是相對、正規化的 POSIX 路徑形式,且不含上層參照。如果傳入不符合規範的鍵,建構函式將引發ValueError例外。如果找不到符合
key的檔案,建構函式將引發ZoneInfoNotFoundError例外。
ZoneInfo 類別有兩個備用建構函式:
- classmethod ZoneInfo.from_file(file_obj, /, key=None)¶
從回傳位元組的類檔案物件(例如以二進位模式開啟的檔案或一個
io.BytesIO物件)建構一個ZoneInfo物件。與主要建構函式不同,這個建構函式總是會建構一個新物件。key參數設定了時區的名稱,用於__str__()和__repr__()。透過此建構函式建立的物件無法被封裝(參閱 pickling)。
如果從 file_obj 讀取的資料不是有效的 TZif 檔案,會引發
ValueError。
- classmethod ZoneInfo.no_cache(key)¶
一個繞過建構函式快取的備用建構函式。它與主要建構函式相同,但每次呼叫都會回傳一個新物件。這對於測試或示範目的最可能有用,但它也可以用來建立一個具有不同快取失效策略的系統。
透過此建構函式建立的物件,在拆封時也會繞過去序列化過程的快取。
警示
使用此建構函式可能會以意想不到的方式改變你的 datetime 物件的語意,只有在你確定需要時才使用它。
以下類別方法也可用:
- classmethod ZoneInfo.clear_cache(*, only_keys=None)¶
一個用於使
ZoneInfo類別上的快取失效的方法。如果沒有傳入引數,所有快取都會失效,且下一次對每個鍵的主要建構函式呼叫都將回傳一個新的實例。如果將一個包含鍵名的可疊代物件傳遞給