django 1.4 – 不能比较偏移天真和偏移量感知的date时间

我正在将应用程序从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.4下,我得到的错误:

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

由于线路

 if timeDue<now and timeDue>dailyTask.last_completed 

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

我试图通过添加pytz.UTC作为参数,使时间timezone知道,但这仍然引发同样的错误。

我已经阅读了一些关于时区的文档,但是对于是否需要制作timeDue时区或是否需要对数据库和现有数据进行基本更改感到困惑。

查看详细信息的详细文档 。

通常,使用django.utils.timezone.now创build一个偏移量感知的当前date时间

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

django.utils.timezone.make_aware做一个偏移感知的date时间

 >>> 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>) 

然后您可以比较两个偏移量感知的date时间没有麻烦。

此外,你可以通过剥离时区信息将offset-awared datetime转换为offset-naive datetime,然后在utc下将它与正常的datetime.datetime.now()进行比较。

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

默认情况下, USE_TZTrue (实际上默认为False ,但django-admin.py startproject生成的settings.py文件将其设置为True ),那么如果您的数据库支持时区感知时间,则时间相关模型领域将是时区意识。 你可以通过在设置中设置USE_TZ=False来禁用它(或者直接删除USE_TZ=True )。