Djangoでタイムゾーンを有効にした時の注意点


Djangoでタイムゾーンを有効にしている場合のお話。
settingsで以下の様にしている前提。

USE_TZ = True
TIME_ZONE = 'Japan'

0時〜9時までの間だけ、2つの日時変数を比較している箇所でassertにひっかかる事案が発生。

調査した結果、TimeZoneを保持したdatetimeクラス変数の場合は、UTCとJSTで比較してもTimeZoneが考慮されるので問題ないが、datetimeのメソッド(今回問題になったのはdatetime.day)を使って比較している場合、TimeZoneが適用されないためと判明。

>>> from datetime import datetime
>>> from django.utils.timezone import get_default_timezone
>>> import pytz
>>> import time
>>>
>>> now = datetime(2015, 9, 2, 2, 0)
>>> now = int(time.mktime(now.timetuple()))
>>>
>>> # JSTのdatetimeクラス変数
>>> jst = get_default_timezone().localize(datetime.fromtimestamp(now))
>>> # UTCのdatetimeクラス変数
>>> utc = pytz.utc.localize(datetime.utcfromtimestamp(now))
>>>
>>>print jst == utc           # datetimeでの比較は問題なくイコール
True
>>>
>>>print jst
2015-09-02 02:00:00+09:00
>>> print utc
2015-09-01 17:00:00+00:00
>>>
>>> print jst.day == utc.day  # datetime.dayメソッドの場合はイコールにならない
False
>>>
>>> print jst.day
2
>>> print utc.day
1
  • このエントリーをはてなブックマークに追加