Python django 1.4-罐和x27;t比较初始偏移量和感知偏移量的日期时间

Python django 1.4-罐和x27;t比较初始偏移量和感知偏移量的日期时间,python,django,timezone,Python,Django,Timezone,我正在将应用程序从django 1.2迁移到1.4 我有一个daily task对象,其中包含一天中任务应完成的时间: class DailyTask(models.Model): time = models.TimeField() last_completed = models.DateTimeField() name = models.CharField(max_length=100) description = models.CharField(max_le

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

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

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
由于线路原因

if timeDue<now and timeDue>dailyTask.last_completed
如果timeDuedailyTask.last\u已完成
两个比较子句都会抛出这个错误

我已经尝试通过添加pytz.UTC作为参数来识别timeDue时区,但这仍然会引发相同的错误

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

查看详细信息

通常,使用
django.utils.timezone.now
创建偏移量感知的当前日期时间

>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=<UTC>)
然后,您可以在没有问题的情况下比较两个偏移量感知的日期时间

此外,您可以通过剥离时区信息将偏移量awared datetime转换为偏移量naive datetime,然后可以在utc下与/normal
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_z
默认为
True
(实际上默认为
False
,但是由
django-admin.py startproject生成的
settings.py
文件将其设置为
True
),如果数据库支持时区感知时间,则与时间相关的模型字段的值将是时区感知的。您可以通过在设置中设置
USE\TZ=False
(或简单地删除
USE\TZ=True
)来禁用它

Django不为TimeField存储感知时间,它只为DateTimeField存储感知时间。这真的很烦人,因为python datetime.time对象和datetime.datetime对象一样支持TZINFO。我想知道他们会在下一个版本中修复它。顺便说一句,我已经在postres 9.1数据库服务器上对它进行了测试。@tejinderss:
datetime.time
是错误的。如果您不知道日期(utc偏移量可能在同一时间不同,但在不同的日期),那么存储
'Asia/Shanghai'
时区是没有意义的。@okm:
make_aware(datetime.now(),get_default_timezone())
如果
get_default_timezone()
与您的本地时区不同,则会失败(应该是,但它不是完全可靠的)。只需使用
timezone.now()
(如果
use\u TZ
True
,则它是时区感知的)。
>>> 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>)
>>> t = timezone.now() # offset-awared datetime
>>> t.astimezone(timezone.utc).replace(tzinfo=None)
datetime.datetime(2012, 5, 18, 13, 11, 30, 705324)