PYTHON MEBY

Pythonでタイムゾーンを設定(pytz, zoneinfo (Python 3.9以降))

この記事では、Pythonでタイムゾーンを扱うための2つの主要な方法、pytzライブラリとPython 3.9以降で標準ライブラリに含まれるzoneinfoモジュールについて解説します。それぞれの使用方法、メリット、デメリットを比較しながら説明します。

目次

pytzライブラリの使用

pytzライブラリは、世界中のタイムゾーンを扱うための強力なツールです。多くのプロジェクトで使用されており、幅広いタイムゾーンをサポートしています。インストールにはpipを使用します。

pip install pytz

インストール後、以下のコードのように使用できます。

import datetime
import pytz

# タイムゾーンの取得
JST = pytz.timezone('Asia/Tokyo')

# 現在時刻の取得 (システムのローカルタイム)
now = datetime.datetime.now()

# タイムゾーンを適用
tokyo_time = JST.localize(now)

# タイムゾーン付き時刻の出力
print(tokyo_time)

localize()メソッドを用いて、naive datetimeオブジェクトにタイムゾーン情報を付与します。

from datetime import datetime
import pytz

# naive datetime object
naive_dt = datetime(2024, 1, 1, 10, 0, 0)

# タイムゾーンを指定してaware datetime objectに変換
aware_dt = pytz.timezone('Asia/Tokyo').localize(naive_dt)

print(aware_dt)

pytzを使用する際の注意点として、タイムゾーンのデータベースを更新する必要がある場合があります。pytzのバージョンによっては、古いタイムゾーンデータが含まれている可能性があります。

  • pip install --upgrade pytz で最新バージョンに更新することを推奨します。

zoneinfoモジュールの使用

Python 3.9以降では、zoneinfoモジュールが標準ライブラリに含まれています。pytzライブラリと同様にタイムゾーンを扱うことができます。追加のインストールは不要です。

from zoneinfo import ZoneInfo
from datetime import datetime

# タイムゾーンの取得
JST = ZoneInfo('Asia/Tokyo')

# 現在時刻の取得 (システムのローカルタイム)
now = datetime.now(JST)

# タイムゾーン付き時刻の出力
print(now)

datetime.now()で直接タイムゾーンを指定して、aware datetime object を作成できます。これはpytzと比べて簡潔です。

from zoneinfo import ZoneInfo
from datetime import datetime

# naive datetime object
naive_dt = datetime(2024, 1, 1, 10, 0, 0)

# タイムゾーンを指定してaware datetime objectに変換
aware_dt = naive_dt.replace(tzinfo=ZoneInfo('Asia/Tokyo'))

print(aware_dt)

zoneinfoモジュールは、pytzに比べてシンプルで軽量であるため、パフォーマンスが向上する可能性があります。

pytzとzoneinfoの比較

pytzとzoneinfoの主な違いは、ライブラリの種類と使用方法です。pytzはサードパーティライブラリであり、zoneinfoはPython標準ライブラリです。zoneinfoはPython 3.9以降でのみ利用可能です。

タイムゾーンの変換例

東京時間(JST)をロンドン時間(GMT)に変換する例です。

from zoneinfo import ZoneInfo
from datetime import datetime

JST = ZoneInfo('Asia/Tokyo')
GMT = ZoneInfo('Europe/London')

now_tokyo = datetime.now(JST)
now_london = now_tokyo.astimezone(GMT)

print(f"東京時間: {now_tokyo}")
print(f"ロンドン時間: {now_london}")

astimezone()メソッドを使用して、タイムゾーンを変換します。

エラーハンドリング

存在しないタイムゾーンを指定した場合、zoneinfoモジュールはZoneInfoNotFoundError例外を発生させます。pytzはpytz.exceptions.UnknownTimeZoneError例外を発生させます。

from zoneinfo import ZoneInfo
from datetime import datetime

try:
    JST = ZoneInfo('Asia/Tokyooo') # 誤ったタイムゾーン名
    now = datetime.now(JST)
except ZoneInfoNotFoundError as e:
    print(f"エラー: {e}")

try-exceptブロックを使用して例外を処理することで、プログラムの安定性を高めることができます。

関連記事