COBAKURA.COM

Djangoのtimezone、localtime、make_awareを理解する

Djangoで時間を扱うときに押さえておきたいtimezoneのポイント。

timezone.now

timezone.now() で取得できる値は USE_TZ で何を設定しているかによって異なる。

  • USE_TZ=True → aware(UTC)な現在時刻。TIME_ZONEの値に関係なく必ずUTCで返す。なので、timezone.now().date() とかやっても東京の日付は正確に取得できない。 (東京が7月4日2時だった場合はtimezon.now()は7月3日17時を返すのでtimezone.now().date()は7月3日になる。)TIME_ZONEの現在時刻を取得したい場合は localtime を使う。
  • USE_TZ=False → naiveな(システム上の)現在時刻。

ドキュメント

localtime

localtime(value=None, timezone=None)

awareなdatetimeを別のタイムゾーンに変更する。(デフォルトは TIME_ZONE で指定したタイムゾーン)
valueを省略した場合は timezone.now() が使われる。(UTCの現在時刻をTokyoに変換する。)

# TIME_ZONEの現在時刻を取得できる
>>> timezone.localtime()
datetime.datetime(2023, 7, 4, 21, 51, 7, 775352, tzinfo=zoneinfo.ZoneInfo(key='Asia/Tokyo'))

# タイムゾーンを変更
>>> now = make_aware(datetime(2023, 7, 3, 23), timezone=timezone.utc)
>>> now
datetime.datetime(2023, 7, 3, 23, 0, tzinfo=datetime.timezone.utc)
>>> timezone.localtime(now)
datetime.datetime(2023, 7, 4, 8, 0, tzinfo=zoneinfo.ZoneInfo(key='Asia/Tokyo'))

ドキュメント

localdate

timezone.localdate(value=None, timezone=None)

awareなdatetimeのTIME_ZONEにおける日付を取得できる。 valueを省略するとnowが使われる。

# TIME_ZONEにおける日付を取得
>>> timezone.localdate()
datetime.date(2023, 7, 4)

ドキュメント

make_aware

make_aware(value, timezone=None, is_dst=None)

valueにnaiveなdatetimeを指定する。timezoneの同じ時点のawareなdatetimeが返る。

>>> naive_now = datetime.now()
>>> aware_now = make_aware(naive_now)
>>> naive_now
datetime.datetime(2023, 7, 4, 18, 15, 52, 721315)
>>> aware_now
datetime.datetime(2023, 7, 4, 18, 15, 52, 721315, tzinfo=zoneinfo.ZoneInfo(key='Asia/Tokyo'))

おすすめ記事

2023/11/15

Git 特定のコミットからブランチを切る方法

2023/8/10

Djangoでエポック秒(unix秒)をテンプレートで表示

2023/7/5

Django OneToOneFieldが存在するかをチェックする方法