timezone.localize не работает должным образом - PullRequest
0 голосов
/ 29 августа 2018

В настоящее время я пытался понять, как timezone.localize работает.

наивное время (без информации о часовом поясе)

Теперь я пытаюсь создать наивное время (без информации о часовом поясе). Я предполагаю, что все будут уважать UTC

>>> d = datetime.datetime.fromtimestamp(1535500800)
>>> d
datetime.datetime(2018, 8, 29, 0, 0)
>>> time.mktime(d.timetuple())
1535500800.0
>>> d.hour
0

(Снимок экрана с https://www.epochconverter.com/, с использованием 1535500800 в качестве метки времени. Красные прямоугольники для часового пояса UTC) enter image description here


Кажется, все хорошо. Теперь я хотел бы поэкспериментировать с timezone.localize


datetime с часовым поясом, используя timezone.localize

>>> d = datetime.datetime.fromtimestamp(1535500800)
>>> d
datetime.datetime(2018, 8, 29, 0, 0)
>>> kl_timezone = timezone('Asia/Kuala_Lumpur')
>>> d = kl_timezone.localize(d)
>>> d
datetime.datetime(2018, 8, 29, 0, 0, tzinfo=<DstTzInfo 'Asia/Kuala_Lumpur' +08+8:00:00 STD>)
>>> time.mktime(d.timetuple())
1535500800.0
>>> d.hour
0

(Снимок экрана с https://www.epochconverter.com/, с использованием 1535500800 в качестве метки времени. Синие прямоугольники для часового пояса Куала-Лумпура)

enter image description here

Подсветка времени в синем прямоугольнике - это часовой пояс Куала-Лумпура. Следовательно, я ожидаю, что после запуска d = kl_timezone.localize(d), d.hour вернется 8.

Это потому, что

  • Учитывая 1535500800 временных меток, жители UTC рассматривают это как 12:00
  • Учитывая 1535500800 меток времени, жители Куала-Лумпура рассматривают это как 8:00 утра

Но, d.hour возвращает 0, даже после того, как я использую kl_timezone.localize(d).

Разве d.hour не должен возвращать 8, потому что в метке времени 1535500800 Куала-Лумпур 8:00 утра?

У меня неправильное ожидание по timezone.localize?

1 Ответ

0 голосов
/ 29 августа 2018

datetime.fromtimestamp фактически преобразует метку времени в ваш местный часовой пояс. Чтобы получить временную метку относительно UTC, вы должны использовать datetime.utcfromtimestamp. Оттуда вы бы сообщили об этом, набрав localize или replace. Затем, чтобы определить, сколько времени будет в Куала-Лумпуре, вы должны использовать astimezone

>>> from datetime import datetime
>>> import pytz
>>> from pytz import timezone
>>> d = datetime.utcfromtimestamp(1535500800)  # naive
>>> d
datetime.datetime(2018, 8, 29, 0, 0)
>>> utc_tz = timezone('UTC')
>>> utc_d = utc_tz.localize(d)  # or utc_d = d.replace(tzinfo=pytz.utc)
>>> utc_d
datetime.datetime(2018, 8, 29, 0, 0, tzinfo=<UTC>)
>>> kl_tz = timezone('Asia/Kuala_Lumpur')
>>> kl_d = utc_d.astimezone(kl_tz)  # convert from UTC to Malaysia
>>> kl_d
datetime.datetime(2018, 8, 29, 8, 0, tzinfo=<DstTzInfo 'Asia/Kuala_Lumpur' +08+8:00:00 STD>)

Чтобы вернуться к метке времени POSIX, вы должны использовать timestamp

>>> kl_d.timestamp()
>>> 1535500800.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...