Я пытаюсь сравнить текущую дату и время с датами и временем, указанными в моделях, используя операторы сравнения:
if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:
Ошибка скрипта с:
TypeError: can't compare offset-naive and offset-aware datetimes
Модели выглядят так:
class Fundraising_Challenge(models.Model):
name = models.CharField(max_length=100)
datetime_start = models.DateTimeField()
datetime_end = models.DateTimeField()
У меня также есть django, использующий дату и время локали.
То, что я не смог найти, это формат, который django использует для DateTimeField (). Это наивно или в курсе? И как мне получить datetime.now () для распознавания локали datetime?
python
django
datetime
comparison
sccrthlt
источник
источник
Ответы:
По умолчанию
datetime
объект находитсяnaive
в Python, поэтому вам нужно сделать их оба наивными или осведомленнымиdatetime
объектами. Это можно сделать с помощью:Примечание: это подняло бы,
ValueError
еслиtzinfo
уже установлено. Если вы не уверены в этом, просто используйтеКстати, вы можете отформатировать метку времени UNIX в объекте datetime.datetime с информацией о часовом поясе следующим образом
источник
tzinfo
не делает никакого преобразования, делая сравнение некорректным.utc = pytz.utc
чтобы предотвратить ошибку PylintNo value for argument 'dt' in unbound method call (no-value-for-parameter)
. Pytz Linkdatetime.datetime.now
не знает часовой пояс.Джанго приходит с помощником для этого, который требует
pytz
Вы должны быть в состоянии сравнить
now
сchallenge.datetime_start
источник
USE_TZ=True
затемtimezone.now()
возвращает объект datetime с учетом часового пояса, даже еслиpytz
он не установлен (хотя может быть рекомендовано установить его по другим причинам).Одна строка кода решения
Разъясненная версия
Резюме
Вы должны добавить информацию о часовом поясе к вашей
now()
дате и времени.Однако вы должны добавить тот же часовой пояс для ссылочной переменной; Вот почему я впервые прочитал
tzinfo
атрибут.источник
Отключить часовой пояс. использование
challenge.datetime_start.replace(tzinfo=None);
Вы также можете использовать
replace(tzinfo=None)
для другой даты и времени .источник
Таким образом, я бы решил эту проблему, чтобы убедиться, что эти два времени находятся в правильном часовом поясе.
Я вижу, что вы используете,
datetime.now()
который будет возвращать текущее время системы без установленной tzinfo.tzinfo - это информация, прикрепленная к дате и времени, чтобы сообщить ей, в каком часовом поясе она находится. Если вы используете наивное время и дату, вы должны быть последовательными во всей своей системе. Я очень рекомендую использовать только
datetime.utcnow()
поскольку вы где-то создаете дату и время, с которыми связана tzinfo, вам нужно убедиться, что они локализованы (с ассоциированной tzinfo) в правильном часовом поясе.
Взгляните на Delorean , это значительно облегчает работу с подобными вещами.
источник
Это работает от меня. Здесь я подхожу к таблице, созданной datetime, и добавляю 10 минут на datetime. позже, в зависимости от текущего времени, выполняются операции истечения срока действия.
Добавлено 10 минут в базу данных datetime
table_datetime = '2019-06-13 07: 49: 02.832969' (пример)
Это сработало для меня.
источник
Просто:
Так что сделайте это:
а затем использовать
start_time
иend_time
источник