Не удается вычесть datetime и timestamp в django?

У меня есть поле timestamp = models.DateTimeField (auto_now_add=True) в БД. Я хочу найти разницу между этой меткой времени и datetime.теперь.)(

когда я попробовал datetime.now () - отметка времени, я получаю ошибку:

can't subtract offset-naive and offset-aware datetimes

Как это исправить?

2 ответов


эта ошибка относится к тому, как время хранится python. Согласно python документация:

существует два вида объектов даты и времени: "наивный" и "осведомленный". Это различие относится к тому, имеет ли объект какое-либо представление о часовом поясе, летнем времени или другом виде алгоритмической или политической корректировки времени.

в Django документация также указано, что:

когда часовой пояс поддержка отключена, Django использует наивные объекты datetime в местное время. Это просто и достаточно для многих случаев использования. В в этом режиме, чтобы получить текущее время, вы напишете:

import datetime
now = datetime.datetime.now() 

когда поддержка часового пояса включена, Django использует объекты datetime с часовым поясом. Если ваш код создает объекты datetime, они также должны быть в курсе. В этом режиме пример сверху становится:

import datetime
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)

вы должны определить, является ли или не вы хотите знать часовой пояс на своем сайте, а затем соответствующим образом настроить сохраненное время. Чтобы преобразовать осведомленный dt в наивный, вы можете использовать модуль pytz и этого:

naive_dt = aware_dt.replace(tzinfo=None)

это работает, потому что все даты python имеют необязательный атрибут часового пояса,tzinfo, который может использоваться для хранения информации о смещении dt от времени UTC.


Holá
Короткий ответ:

tz_info = your_timezone_aware_variable.tzinfo

diff = datetime.datetime.now(tz_info) - your_timezone_aware_variable:

вы должны добавить информацию о часовом поясе в свое время now ().
Но вы должны добавить то же самое часовой пояс переменной, поэтому я сначала прочитал атрибут tzinfo.