Djangoのタイムゾーンサポートの動作について

Djangoタイムゾーンサポートについてメモ。settings.USE_TZをTrueにすると有効になる。
試したのはPython 2.7, Django 1.6.2。
Django1.6だと、プロジェクト新規作成時のsettings.pyでUSE_TZはTrueに設定されている。(ドキュメントではデフォルトでは無効と書かれてることに注意。django.conf.global_settings.USE_TZはFalse)

settings.USE_TZがTrueのとき

タイムゾーンサポートが有効になっていると、django.utils.timezone.nowはtzinfoにsettings.TIME_ZONEで設定したタイムゾーンのオブジェクトが指定された現在日時(datetimeオブジェクト)を返す。

>>> import django.utils.timezone as timezone
>>> timezone.now()
datetime.datetime(2014, 3, 21, 9, 13, 1, 524030, tzinfo=<UTC>)
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2014, 3, 21, 9, 13, 6, 707124)

settings.USE_TZがFalseのとき

タイムゾーンサポートが無効だと、timezone.nowはtzinfoを指定しない現在日時を返す。

>>> import django.utils.timezone as timezone
>>> timezone.now()
datetime.datetime(2014, 3, 21, 9, 16, 14, 512043)
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2014, 3, 21, 9, 16, 31, 846247)

pytzとの連携について

pytzがインストールされている場合、Djangoはpytzのタイムゾーン定義を使用する。タイムゾーンを有効にする場合、pytzをインストールすることを推奨している。詳細はドキュメントに書かれている。