Python 3.9以降、日付と時刻のタイムゾーン処理には標準ライブラリの zoneinfo モジュールを使用するのが推奨されています。
これにより、日本時間(Asia/Tokyo)や協定世界時(UTC)など、地域ごとのタイムゾーン情報を正確に扱えるようになります。 この記事では、タイムゾーン付きの日時オブジェクトの生成方法と、タイムゾーン情報を持たない日時(Naive)への情報の付与方法を解説します。
目次
前提:tzdataのインストール
Windows環境など、システムにIANAタイムゾーンデータベースが含まれていない環境では、以下のパッケージをインストールする必要があります。
pip install tzdata
1. 生成時にタイムゾーンを指定する方法
datetime オブジェクトを作成する際、tzinfo 引数に ZoneInfo オブジェクトを渡すことで、最初からタイムゾーン情報を持った(Awareな)日時を生成できます。
実装例:会議日時の設定
from datetime import datetime
from zoneinfo import ZoneInfo
# 1. 特定の日時にタイムゾーン(JST)を指定して生成
# 2024年9月1日 10:30 (日本時間)
meeting_schedule = datetime(
2024, 9, 1, 10, 30,
tzinfo=ZoneInfo("Asia/Tokyo")
)
print(f"指定日時 (JST): {meeting_schedule}")
# 2. 現在時刻をタイムゾーン(JST)指定で取得
# datetime.now() の tz 引数に指定します
current_time_jst = datetime.now(tz=ZoneInfo("Asia/Tokyo"))
print(f"現在日時 (JST): {current_time_jst}")
実行結果
指定日時 (JST): 2024-09-01 10:30:00+09:00
現在日時 (JST): 2025-12-15 19:30:00.123456+09:00
※ +09:00 が付与されており、日本時間であることが明確になっています。
2. 既存の日時にタイムゾーンを付与する方法(replace)
タイムゾーン情報を持たない日時オブジェクト(Naive datetime)に対し、後からタイムゾーン情報を割り当てたい場合は replace() メソッドを使用します。
実装例:ログデータのタイムゾーン設定
from datetime import datetime
from zoneinfo import ZoneInfo
# タイムゾーン情報を持たない日時(Naive)
# 例: ログファイルから読み取った日時など
naive_dt = datetime(2024, 9, 1, 10, 30)
print(f"元の日時 (Naive): {naive_dt}")
# 1. 日本時間 (Asia/Tokyo) を付与
# replaceメソッドで tzinfo 属性だけを書き換えます
dt_jst = naive_dt.replace(tzinfo=ZoneInfo("Asia/Tokyo"))
print(f"日本時間付与 : {dt_jst}")
# 2. 協定世界時 (UTC) を付与
dt_utc = naive_dt.replace(tzinfo=ZoneInfo("UTC"))
print(f"UTC付与 : {dt_utc}")
実行結果
元の日時 (Naive): 2024-09-01 10:30:00
日本時間付与 : 2024-09-01 10:30:00+09:00
UTC付与 : 2024-09-01 10:30:00+00:00
解説
- ZoneInfo(“地域/都市”): IANAタイムゾーンデータベースの識別子(例:
"Asia/Tokyo","America/New_York","UTC")を文字列で指定します。 - Naive と Aware:
- Naive(ナイーブ): タイムゾーン情報を持たない日時。ローカルな処理では扱いやすいですが、国際的な比較や変換には向きません。
- Aware(アウェア): タイムゾーン情報を持つ日時。
+09:00などのオフセット情報を持ち、異なるタイムゾーン間の計算が可能になります。
- replace() の注意点:
replace(tzinfo=...)は、時刻の値そのものは変えずに、「この時刻は◯◯タイムゾーンのものです」というラベルを貼る操作です。時差の変換(例:JSTをUTCに換算する)を行いたい場合は、astimezone()メソッドを使用する必要があります。
