fromtimestamp возвращает разные результаты - PullRequest
0 голосов
/ 08 января 2019

У меня есть следующий код:

import datetime

dt = 1546955400
print(datetime.datetime.fromtimestamp(dt))

Когда я запускаю этот код на своем локальном компьютере, я получаю правильное (ожидаемое) время, равное

2019-01-08 15:50:00.

Однако я попытался запустить этот же код на виртуальной машине, и результат был 2019-01-08 13:50:00 (двумя часами ранее). Почему это происходит и как я могу это исправить, чтобы я всегда получал первый, независимо от того, где выполняется код?

1 Ответ

0 голосов
/ 08 января 2019

datetime.datetime.fromtimestamp() возвращает местное время . Из документации :

Возвращает локальную дату и время, соответствующие метке времени POSIX, например, возвращается time.time(). Если необязательный аргумент tz равен None или не указан, отметка времени преобразуется в локальные дату и время платформы, а возвращаемый объект datetime является наивным.

Значение метки времени - это смещение в секундах от значения UNIX эпохи , полночь 1 января 1970 года, в часовом поясе UTC. Местное время - это общесистемное настроенное смещение от UTC, местного часового пояса.

Если ваша виртуальная машина дает неожиданные результаты, вам необходимо настроить часовой пояс ОС.

Либо игнорируйте часовые пояса и работайте только со временем в часовом поясе UTC. Для отметок времени это означает использование функции datetime.datetime.utcfromtimestamp() .

Ваша конкретная отметка времени - 13:50 UTC:

>>> dt = 1546955400
>>> from datetime import datetime
>>> datetime.utcfromtimestamp(dt)
datetime.datetime(2019, 1, 8, 13, 50)
>>> print(_)
2019-01-08 13:50:00

, поэтому ваша виртуальная машина настроена на часовой пояс UTC или GMT (последний в настоящее время находится на UTC + 0, пока не будет переключен на британское летнее время часовой пояс BST). Ваша локальная система находится в UTC + 2 часовых поясах , учитывая ваше заявленное местоположение из вашего профиля, которое будет EEE, пасхальное европейское время .

Другой вариант - создать временную метку с учетом часового пояса, передав аргумент tz. Если у вас есть конкретное смещение UTC, просто создайте datetime.timezone() экземпляр для этого смещения:

utcplus2 = datetime.timezone(datetime.timedelta(hours=2))
datetime.datetime.fromtimestamp(dt, utcplus2)

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

...