Python 3.9以降、zoneinfo
は標準ライブラリの一部として組み込まれています。このモジュールは、PEP 615で最初に指定されたように、IANAタイムゾーンデータベースをサポートする具体的なタイムゾーン実装を提供します。
デフォルトでは、zoneinfo
は利用可能な場合にシステムのタイムゾーンデータを使用します。システムのタイムゾーンデータが利用できない場合、ライブラリはPyPIで利用可能な第一パーティのtzdata
パッケージを使用するようにフォールバックします。
Python 3.9未満のバージョンを使用している場合、backports.zoneinfo
をインストールして代替として使用することができます。これはzoneinfo
モジュールのバックポートで、システムのタイムゾーンデータが利用できない場合(特にWindows)、tzdata
エクストラを使用することもできます。
pip install backports.zoneinfo
または
pip install backports.zoneinfo[tzdata]
このモジュールは、Python 3.9の標準ライブラリモジュールzoneinfo
のドロップイン置換として機能します。Python 3.6以上をサポートしている場合、次のイディオムを使用してbackports.zoneinfo
に「フォールバック」することができます。
try:
import zoneinfo
except ImportError:
from backports import zoneinfo
このモジュールを使用してタイムゾーンにアクセスするには、ZoneInfo
オブジェクトを構築し、それをdatetime
にアタッチします。
from backports.zoneinfo import ZoneInfo
from datetime import datetime, timedelta, timezone
dt = datetime(1992, 3, 1, tzinfo=ZoneInfo("Europe/Minsk"))
print(dt) # 1992-03-01 00:00:00+02:00
print(dt.utcoffset()) # 2:00:00
print(dt.tzname()) # EET
算術は「正規化」ステップなしで期待通りに動作します。
dt += timedelta(days=90)
print(dt) # 1992-05-30 00:00:00+03:00
print(dt.utcoffset()) # 3:00:00
print(dt.tzname()) # EEST
曖昧で想像上の時間は、PEP 495で追加されたfold
属性を使用して処理されます。
dt = datetime(2020, 11, 1, 1, tzinfo=ZoneInfo("America/Chicago"))
print(dt) # 2020-11-01 01:00:00-05:00
print(dt.replace(fold=1)) # 2020-11-01 01:00:00-06:00
以上がPythonのzoneinfo
モジュールの基本的な使い方になります。タイムゾーンを扱う際には、このモジュールが非常に便利です。