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