Django 1.4 - не может сравнивать даты смещения и наименьшего времени
Я выполняю миграцию приложения из 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.2, но под 1.4 я получаю ошибку:
can't compare offset-naive and offset-aware datetimes
из-за линии
if timeDue<now and timeDue>dailyTask.last_completed
и оба предложения сравнения бросают эту ошибку.
Я пробовал сделать timeDue часовым поясом, добавив pytz.UTC в качестве аргумента, но это все равно вызывает ту же ошибку.
Я прочитал некоторые документы по тайм-зонам, но не понимаю, нужно ли мне просто указывать часовой пояс timeDue, или мне нужно внести фундаментальные изменения в мои db и существующие данные.
Ответы
Ответ 1
Проверьте подробный документ для подробной информации.
Обычно используйте django.utils.timezone.now
для создания текущего времени datetime, поддерживающего смещение
>>> 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>)
Затем вы могли бы сравнить время с учетом смещения без проблем.
Кроме того, вы можете преобразовать offset-awared datetime в офлайновое наивное datetime, отключив информацию о часовом поясе, затем его можно сравнить с обычным 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)
USE_TZ
по умолчанию равен True
'(на самом деле это False
по умолчанию, но файл settings.py
, сгенерированный django-admin.py startproject
) устанавливает его на True
), тогда, если ваша БД поддерживает часовую зону времена, значения временных полей, связанных с временем, были бы осведомлены о часовом поясе. вы можете отключить его, установив USE_TZ=False
(или просто удалить USE_TZ=True
) в настройках.