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

想定どおり。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です