Pythonでタイムゾーン情報を扱うベストプラクティス

2024-04-02

PythonのData TypesにおけるZoneInfoの使用

Pythonのdatetimeモジュールは、日付と時刻を扱うための標準ライブラリです。このモジュールには、タイムゾーン情報を扱うためのzoneinfoサブモジュールも含まれています。

ZoneInfoは、世界中のタイムゾーンに関する情報を含むデータベースです。このデータベースは、IANA (Internet Assigned Numbers Authority) によって管理されています。

ZoneInfoを使用すると、特定のタイムゾーンにおける現在時刻を取得したり、異なるタイムゾーン間の変換を行ったりすることができます。

例1:特定のタイムゾーンにおける現在時刻を取得する

from datetime import datetime, timezone

# ロンドンのタイムゾーンを取得
london_tz = timezone("Europe/London")

# ロンドンの現在時刻を取得
now_in_london = datetime.now(london_tz)

# 出力
print(now_in_london)

出力例

2024-03-20 12:08:00+00:00

例2:異なるタイムゾーン間の変換を行う

from datetime import datetime, timezone

# 東京のタイムゾーンを取得
tokyo_tz = timezone("Asia/Tokyo")

# ロンドンの現在時刻を取得
now_in_london = datetime.now(timezone("Europe/London"))

# ロンドンの現在時刻を東京のタイムゾーンに変換
now_in_tokyo = now_in_london.astimezone(tokyo_tz)

# 出力
print(now_in_tokyo)

出力例

2024-03-20 21:08:00+09:00


ZoneInfoを使用したサンプルコード

特定のタイムゾーンにおける現在時刻を取得する

from datetime import datetime, timezone

# ロンドンのタイムゾーンを取得
london_tz = timezone("Europe/London")

# ロンドンの現在時刻を取得
now_in_london = datetime.now(london_tz)

# 出力
print(now_in_london)
2024-03-20 12:08:00+00:00

異なるタイムゾーン間の変換を行う

from datetime import datetime, timezone

# 東京のタイムゾーンを取得
tokyo_tz = timezone("Asia/Tokyo")

# ロンドンの現在時刻を取得
now_in_london = datetime.now(timezone("Europe/London"))

# ロンドンの現在時刻を東京のタイムゾーンに変換
now_in_tokyo = now_in_london.astimezone(tokyo_tz)

# 出力
print(now_in_tokyo)

出力例

2024-03-20 21:08:00+09:00

特定の日付と時刻におけるタイムゾーン情報を取得する

from datetime import datetime, timezone

# ロンドンのタイムゾーンを取得
london_tz = timezone("Europe/London")

# 特定の日付と時刻を作成
specific_time = datetime(2024, 3, 20, 12, 0, 0, tzinfo=london_tz)

# 特定の日付と時刻におけるタイムゾーン情報を取得
print(specific_time.tzname())

出力例

GMT

特定のタイムゾーンにおけるサマータイムの開始時刻と終了時刻を取得する

from datetime import datetime, timezone

# ニューヨークのタイムゾーンを取得
newyork_tz = timezone("America/New_York")

# 特定の年におけるサマータイムの開始時刻と終了時刻を取得
for tz_info in newyork_tz.transitions(2024):
    print(tz_info)

出力例

(datetime.datetime(2024, 3, 10, 2, 0, 0, tzinfo=datetime.timezone(timedelta(hours=-5))), datetime.datetime(2024, 11, 4, 2, 0, 0, tzinfo=datetime.timezone(timedelta(hours=-5))))

特定のタイムゾーンにおけるすべてのタイムゾーン情報を取得する

from datetime import datetime, timezone

# すべてのタイムゾーン情報を取得
for tz_name in timezone.all_timezones:
    print(tz_name)

出力例

Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
...
  • ZoneInfoモジュールは、pip install zoneinfo コマンドでインストールできます。


ZoneInfo 以外のタイムゾーン情報を使用する方法

pytz モジュールは、ZoneInfo データベースを含む、タイムゾーン情報を扱うためのサードパーティライブラリです。

from pytz import timezone

# ロンドンのタイムゾーンを取得
london_tz = timezone("Europe/London")

# ロンドンの現在時刻を取得
now_in_london = datetime.now(london_tz)

# 出力
print(now_in_london)

出力例

2024-03-20 12:08:00+00:00

dateutil モジュールは、日付と時刻を扱うためのサードパーティライブラリです。

from dateutil import tz

# ロンドンのタイムゾーンを取得
london_tz = tz.gettz("Europe/London")

# ロンドンの現在時刻を取得
now_in_london = datetime.now(london_tz)

# 出力
print(now_in_london)

出力例

2024-03-20 12:08:00+00:00

自作のタイムゾーン情報

ZoneInfo などのデータベースを使用せず、自作のタイムゾーン情報を使用することもできます。

from datetime import datetime, timedelta

# 日本とロンドンの時差を定義
JST = timedelta(hours=9)
GMT = timedelta()

# ロンドンの現在時刻を取得
now_in_london = datetime.now(GMT)

# ロンドンの現在時刻を日本の時間に変換
now_in_japan = now_in_london + JST

# 出力
print(now_in_japan)

出力例

2024-03-20 21:08:00+09:00
  • ZoneInfo は、最も標準的な方法であり、多くのライブラリでサポートされています。
  • pytz モジュールは、ZoneInfo データベースに加えて、その他の機能も提供しています。
  • dateutil モジュールは、日付と時刻を扱うための便利な機能を提供しています。
  • 自作のタイムゾーン情報は、特殊な要件を満たす必要がある場合に使用できます。

ZoneInfo は、Python でタイムゾーン情報を扱うための標準的な方法です。

他の方法も存在しますが、ZoneInfo は多くのライブラリでサポートされており、最も標準的な方法であるため、多くの場合 ZoneInfo を使用するのがおすすめです。