🐍 Python
タイムゾーン付き(aware)と無し(naive)の違い
Pythonのdatetimeには、タイムゾーン情報を持たない「naive」な日時と、持つ「aware」な日時の2種類があります。tzinfo属性がNoneかどうかで見分けられ、この2つを混在させると比較・演算でエラーになります。
dt.tzinfo is None # Trueならnaive
datetime(..., tzinfo=timezone.utc) # awareな日時を作る
dt.astimezone(tz) # 別のタイムゾーンに変換する
from datetime import datetime, timezone
naive_dt = datetime(2026, 8, 10, 9, 0, 0)
print(naive_dt.tzinfo)
# None ← naive(タイムゾーン情報なし)
aware_dt = datetime(2026, 8, 10, 9, 0, 0, tzinfo=timezone.utc)
print(aware_dt.tzinfo)
# UTC ← aware(タイムゾーン情報あり)
# timedeltaを使って任意のオフセットのタイムゾーンも作れる(例: 日本標準時 UTC+9)
from datetime import datetime, timezone, timedelta
jst = timezone(timedelta(hours=9))
aware_jst = datetime(2026, 8, 10, 9, 0, 0, tzinfo=jst)
print(aware_jst)
# 2026-08-10 09:00:00+09:00
# astimezone()で別のタイムゾーンの時刻に変換する
from datetime import datetime, timezone, timedelta
jst = timezone(timedelta(hours=9))
aware_jst = datetime(2026, 8, 10, 9, 0, 0, tzinfo=jst)
converted = aware_jst.astimezone(timezone.utc)
print(converted)
# 2026-08-10 00:00:00+00:00 ← JST9時はUTCでは同日0時
# naiveとawareの==比較は例外にならず、静かにFalseになる
from datetime import datetime, timezone
naive_dt = datetime(2026, 8, 10, 9, 0, 0)
aware_dt = datetime(2026, 8, 10, 9, 0, 0, tzinfo=timezone.utc)
print(naive_dt == aware_dt)
# False ← 見た目が同じ時刻でも、tzinfoの有無だけでFalseになる
naive / awareの基礎
- naive(素朴)
- タイムゾーン情報を持たない日時。
datetime.now()やdatetime(2026, 8, 10)のようにtzinfoを指定しないと作られる - aware(自覚的)
- タイムゾーン情報を持つ日時。
tzinfo引数にtimezone.utcやtimezone(timedelta(hours=9))を渡して作る
💡 AIコードレビュー観点:外部と日時をやり取りするならawareに統一する
API連携やデータベース保存など、システム外部と日時をやり取りするコードでnaiveな日時をそのまま使っていると、サーバーとクライアントのタイムゾーンが異なる環境で日時がずれるバグの原因になります。AIが生成したコードでdatetime.now()が多用されている場合、それが「表示専用のローカル時刻」なのか「外部に渡す時刻」なのかを見極め、後者ならdatetime.now(timezone.utc)のように明示的にawareにすることを検討しましょう。
← Python datetime クイックリファレンス一覧へ戻る / isoformatでISO 8601形式に変換する →