1. はじめに
Pythonで日付や時刻を扱う場面は多くありますが、特に国際化対応やログの管理、スケジューリングといったシーンでは「タイムゾーン付きのdatetime」を正しく扱うことが重要になります。
本記事では、Pythonでタイムゾーンを扱うための定番ライブラリ「pytz」の使い方について、初心者にも分かりやすく解説します。
「Python|タイムゾーン付きのdatetimeを扱う:pytzの使い方」というテーマで、基本的な使い方から、実務でよく使われる応用例、初心者がつまづきやすいポイントまで丁寧に紹介していきます。
2. Pythonでのタイムゾーン処理の基本とpytzの役割
2-1. datetimeモジュールのタイムゾーン対応
Python標準のdatetime
モジュールでは、tzinfo
を使ってタイムゾーン付きの日時を扱うことができますが、そのままでは扱いがやや面倒です。
そこで便利なのが「pytz
」という外部ライブラリです。
2-2. pytzとは
pytz
は、世界中のタイムゾーン情報(IANAタイムゾーンデータベース)に対応したタイムゾーン処理ライブラリです。
これにより、タイムゾーンを指定した日時の変換やローカライズが簡単に行えます。
2-3. pytzのインストール
以下のコマンドでインストールできます:
pip install pytz
2-4. タイムゾーン付きの現在時刻を取得する
日本(Asia/Tokyo)の現在時刻を取得する例です。
from datetime import datetime
import pytz
# タイムゾーンを取得
tokyo = pytz.timezone('Asia/Tokyo')
# タイムゾーン付き現在時刻を取得
dt = datetime.now(tokyo)
print(dt)
実行結果:
2025-07-27 15:10:23.123456+09:00
+09:00
のように、UTCからの差(オフセット)が付いているのが特徴です。
3. pytzのよくある使い方・応用例
3-1. UTC時刻を日本時間に変換する
グローバルなアプリでは、UTC(協定世界時)で保存されたデータを、ユーザーの現地時間に変換する処理が必要になります。
# UTCで保存された時刻(naiveなdatetime)
from datetime import datetime
import pytz
utc_time = datetime(2025, 7, 27, 6, 0, 0)
# UTCにローカライズ
utc = pytz.utc
utc_dt = utc.localize(utc_time)
# 日本時間に変換
tokyo = pytz.timezone('Asia/Tokyo')
jst_dt = utc_dt.astimezone(tokyo)
print(jst_dt)
実行結果:
2025-07-27 15:00:00+09:00
3-2. naiveなdatetimeをawareなdatetimeに変換する
Pythonのdatetimeオブジェクトには「naive(タイムゾーンなし)」と「aware(タイムゾーンあり)」の2種類があります。
pytz.localize()
を使ってnaiveな日時にタイムゾーン情報を付加できます。
from datetime import datetime
import pytz
# タイムゾーンなしのdatetime
naive_dt = datetime(2025, 12, 25, 10, 0, 0)
# タイムゾーンを付与(東京時間)
tokyo = pytz.timezone('Asia/Tokyo')
aware_dt = tokyo.localize(naive_dt)
print(aware_dt)
実行結果:
2025-12-25 10:00:00+09:00
3-3. 利用可能なタイムゾーン一覧を取得する
対応しているタイムゾーン名を一覧表示できます。
import pytz
# 全タイムゾーン名を表示
for tz in pytz.all_timezones[:5]:
print(tz)
実行結果:
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
4. タイムゾーン付きdatetimeの注意点・エラー対策
4-1. naiveとawareを混在させない
datetime同士の比較や演算で、naiveとawareを混ぜるとエラーになります。
常にローカライズしてから使うようにしましょう。
4-2. 夏時間(DST)に注意
一部地域では夏時間(DST)が導入されています。
pytzはこれにも対応していますが、datetimeをローカライズする際にis_dst
を明示しないと例外が出ることがあります。
4-3. UTCベースの保存が安全
実務では、DB保存は常にUTCで統一し、表示時に変換するのが安全です。
5. まとめ
pytz
を使えば、タイムゾーン付きのdatetimeを簡単に扱えるlocalize()
とastimezone()
の使い方がポイント- 実務では「UTC保存→現地時間表示」が基本スタイル
Python初心者の方でも、pytzを使えば世界中の時間を正確に処理できるようになります。
スケジュール管理アプリ、ログ解析、グローバル対応Webアプリなど、様々な場面で活用できますので、ぜひ一度使ってみてください!