Django 日時フィールドの比較を行う
Python2.7 + Django 1.7 で日時フィールド(DateTimeField) の比較を行う。
期限を1日後に設定し、その期間に入っているかを調べるということをやりたい。
列の定義はこんな感じ。
activate_date_time = models.DateTimeField(null=True)
あまり考えずに、
from datetime import datetime,timedelta user.activate_limit_date_time = datetime.now() + timedelta(days=1) user.save()
てな感じで設定して、比較するともれなく
if datetime.now() <= user.activate_limit_date_time: #OK else: #NG
こんなエラー
can't compare offset-naive and offset-aware datetimes
日付の比較には、タイムゾーン情報を持っているものと持っていない物を比較するとこのようなエラーとなるようだ。
http://django-docs-ja.readthedocs.org/en/latest/topics/i18n/timezones.html
ということで、内部的には、UTCでもっておいて、ユーザーに表示するときにローカル時間に表示するのが良さそうだ。
from datetime import datetime,timedelta from django.utils.timezone import utc utc_now = datetime.utcnow().replace(tzinfo=utc) user.activate_limit_date_time = utc_now + timedelta(days=1) user.save()
という感じに書き換えて、以下のように比較する
utc_now = datetime.utcnow().replace(tzinfo=utc) if utc_now <= user.activate_limit_date_time: #OK else: #NG
プリントすると、それぞれ以下
#登録時 2015-04-29 13:43:37.829000+00:00 2015-04-30 13:43:37.829000+00:00 #比較時 2015-04-30 13:43:37.829000+00:00 2015-04-30 13:43:37.829000+00:00
想定どおり。