django 1.4 - 无法比较抵消天真和抵消意识日期时间

问题描述:

我正在从django 1.2迁移到1.4的应用程序的过程。django 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时区,但这仍然会引发相同的错误。

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

查看the thorough document了解详细信息。

通常情况下,使用django.utils.timezone.now使偏移感知当前日期时间

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

而且django.utils.timezone.make_aware使偏移感知日期时间

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

然后,您可以比较这两个偏移感知日期时间W /麻烦。

此外,您可以通过剥离时区信息来将偏移量认可的日期时间转换为抵消天真日期时间,然后可以在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)来禁用它。

+4

Django不存储TimeField的感知时间,它只对DateTimeField有效。它真的很烦人,因为python的datetime.time对象支持TZINFO就像datetime.datetime对象一样。我想知道他们会在下一个版本中修复它。顺便说一句,我已经在postres 9.1数据库服务器上测试过它。 – tejinderss

+0

@tejinderss:'datetime.time'是错误的。如果您不知道日期(在同一时间但不同日期,utc偏移量可能会有所不同),则无需存储“亚洲/上海”时区。 – jfs

+0

@okm:''make_aware(datetime.now(),get_default_timezone())'如果'get_default_timezone()'不同于你的本地时区(它应该是,但它不是完全可以依赖的)。只需使用'timezone.now()'(如果'USE_TZ'为'True',则可以识别时区]。 – jfs