Django 1.4-不能比较初始偏移量和感知偏移量的日期时间

我正在将一个应用程序从 django 1.2迁移到1.4。

我有一个每日任务对象,其中包含一天中任务应该完成的时间:

class DailyTask(models.Model):
time = models.TimeField()
last_completed = models.DateTimeField()
name = models.CharField(max_length=100)
description = models.CharField(max_length=1000)
weekends = models.BooleanField()


def __unicode__(self):
return '%s' % (self.name)


class Meta:
db_table = u'dailytask'
ordering = ['name']

为了检查一项任务是否仍然需要在今天完成,我有以下代码:

def getDueDailyTasks():
dueDailyTasks=[]
now = datetime.datetime.now()
try:
dailyTasks = DailyTask.objects.all()
except dailyTask.DoesNotExist:
return None
for dailyTask in dailyTasks:
timeDue = datetime.datetime(now.year,now.month,now.day,dailyTask.time.hour,dailyTask.time.minute,dailyTask.time.second)
if timeDue<now and timeDue>dailyTask.last_completed:
if dailyTask.weekends==False and now.weekday()>4:
pass
else:
dueDailyTasks.append({'id':dailyTask.id,
'due':timeDue,
'name': dailyTask.name,
'description':dailyTask.description})
return dueDailyTasks

这在1.2以下很好用,但是在1.4以下我得到了错误:

can't compare offset-naive and offset-aware datetimes

因为这条线

if timeDue<now and timeDue>dailyTask.last_completed

两个比较子句都抛出此错误。

我已经尝试通过添加 pytz.UTC 作为参数来识别 timeDue timezone,但是这仍然会产生相同的错误。

我已经阅读了一些关于时区的文档,但是对于我是否只需要让 timeDuvetimezone 知道,或者是否需要对数据库和现有数据进行根本性的更改,我感到困惑。

60571 次浏览

Check the thorough document for detail info.

Normally, use django.utils.timezone.now to make an offset-aware current datetime

>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=<UTC>)

And django.utils.timezone.make_aware to make an offset-aware datetime

>>> timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone())
datetime.datetime(2012, 5, 18, 21, 5, 53, 266396, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

You could then compare both offset-aware datetimes w/o trouble.

Furthermore, you could convert offset-awared datetime to offset-naive datetime by stripping off timezone info, then it could be compared w/ normal datetime.datetime.now(), under utc.

>>> t = timezone.now() # offset-awared datetime
>>> t.astimezone(timezone.utc).replace(tzinfo=None)
datetime.datetime(2012, 5, 18, 13, 11, 30, 705324)

USE_TZ is True 'by default' (actually it's False by default, but the settings.py file generated by django-admin.py startproject set it to True), then if your DB supports timezone-aware times, values of time-related model fields would be timezone-aware. you could disable it by setting USE_TZ=False(or simply remove USE_TZ=True) in settings.