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'))