mee*_*eep 82 python django timezone
我正在将应用程序从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']
Run Code Online (Sandbox Code Playgroud)
为了检查今天是否仍需要完成任务,我有以下代码:
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
Run Code Online (Sandbox Code Playgroud)
这在1.2下工作正常,但在1.4以下我得到错误:
can't compare offset-naive and offset-aware datetimes
Run Code Online (Sandbox Code Playgroud)
由于线
if timeDue<now and timeDue>dailyTask.last_completed
Run Code Online (Sandbox Code Playgroud)
并且两个比较子句都抛出此错误.
我已经尝试通过添加pytz.UTC作为参数来识别timeDue时区,但这仍然会引发相同的错误.
我已经阅读了一些关于时区的文档但是我是否只需要知道timeDue时区,或者我是否需要对我的数据库和现有数据进行根本性更改感到困惑.
okm*_*okm 163
检查彻底文件的详细信息.
通常,用于django.utils.timezone.now
创建偏移感知的当前日期时间
>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
并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>)
Run Code Online (Sandbox Code Playgroud)
然后,您可以比较无错误的偏移感知日期时间.
此外,您可以通过剥离时区信息将偏移感知日期时间转换为偏移天真日期时间,然后可以datetime.datetime.now()
在utc下与正常情况进行比较.
>>> t = timezone.now() # offset-awared datetime
>>> t.astimezone(timezone.utc).replace(tzinfo=None)
datetime.datetime(2012, 5, 18, 13, 11, 30, 705324)
Run Code Online (Sandbox Code Playgroud)
USE_TZ
是True
"默认情况下"(实际上它是False
默认情况下,但settings.py
通过django-admin.py startproject
将其设置为生成的文件True
),然后如果您的数据库支持时区感知时间,则与时间相关的模型字段的值将是时区感知的.您可以通过在设置中设置USE_TZ=False
(或简单删除USE_TZ=True
)来禁用它.
归档时间: |
|
查看次数: |
49841 次 |
最近记录: |