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