【Python】タイムゾーンを扱うzoneinfoの使い方:JSTとUTCの変換

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() メソッドを使用する必要があります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次