datetime.timestamp () теряет время (час) - PullRequest
0 голосов
/ 12 сентября 2018

Я столкнулся с этой проблемой, но нашел решение после небольшого исследования. Я разместил свой ответ ниже, чтобы показать мои выводы. Если у кого-то есть альтернативные предложения, пожалуйста, напишите их.

Мне нужно было преобразовать datetime.datime объект в метку времени Unix. Я пытался использовать datetime.timestamp. Я обнаружил, что результат оказался на 1 час меньше, чем я ожидал. Мне удалось повторить эту проблему со следующим.

from datetime import datetime, timestamp
dt = datetime.utcfromtimestamp(1438956602.0)

ДТ теперь равно datetime.datetime(2015, 8, 7, 14, 10, 2)

Тогда:

dt_stamp = datetime.timestamp(dt)

Что дает dt_stamp = 1438953002.0 (что отличается от нашей первоначальной отметки времени). Если мы преобразуем его обратно в datetime

datetime.utcfromtimestamp(dt_stamp)

Получаем:

datetime.datetime(2015, 8, 7, 13, 10, 2)

Что на час раньше нашего первоначального времени.

Для контекста я использую Python 3 и базируюсь в Великобритании, где в настоящее время мы используем британское летнее время (на 1 час раньше UTC).

Мое решение можно найти ниже. Если вы думаете, что я что-то упустил из моего объяснения или есть лучшее решение, пожалуйста, оставьте свой собственный ответ.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Причина этой разницы фактически показана в документации datetime.timestamp .

Предполагается, что наивные экземпляры datetime представляют местное время, и этот метод основан на платформе CФункция mktime () для выполнения преобразования.Поскольку datetime поддерживает более широкий диапазон значений, чем mktime () на многих платформах, этот метод может вызывать OverflowError для времен, прошедших в прошлом или в будущем.

Поскольку я нахожусь в UTC + 1 (во времяБританское летнее время) это часовой пояс, который datetime.timestamp использует для вычисления метки времени.Вот здесь и возникает ошибка. В документации рекомендуется несколько способов решения этой проблемы.Я пошел со следующим:

from datetime import datetime, timestamp
dt = datetime.utcfromtimestamp(1438956602.0)
dt_stamp = datetime.timestamp(dt.replace(tzinfo=timezone.utc))

Добавляя .replace(tzinfo=timezone.utc) к концу dt, это указывает, что это делается в часовом поясе UTC.datetime.timestamp затем знает, что нужно использовать время UTC, а не часовой пояс, на котором работает моя машина.

Люди в Америке или других частях мира столкнутся с этой проблемой, если не использовать часовой пояс UTC.Если это так, вы можете установить tzinfo в любой часовой пояс.Также обратите внимание, что datetime.utcfromtimestamp также явно предназначен для людей, использующих часовой пояс UTC.

0 голосов
/ 12 сентября 2018

Я думаю, вам нужен так называемый осведомленный объект datetime. Осознание означает, что теперь у вас есть разница во времени:

datetime.fromtimestamp(timestamp, timezone(timedelta(hours=1)))

Попробуйте это с той строкой кода, где timestamp - ваша временная метка Unix.

...