Почему мой код не работает, чтобы объекты даты и времени учитывали часовой пояс? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть два объекта datetime Python, которые представляют один и тот же момент времени:

a = datetime.datetime(2018, 10, 28, 13, 26, 30)
b = datetime.datetime(2018, 10, 28, 7, 26, 30)

Оба поступают из разных источников. Я знаю, что первый в UTC, а второй в "America/Edmonton" (MDT). Первоначально ни к одному из них не привязан часовой пояс.

Мне нужно добавить часовые пояса к этим объектам и сравнить их так, чтобы a == b было True.

Что я сделал, это было:

import datetime
from pytz import timezone

a = datetime.datetime(2018, 10, 28, 13, 26, 30)
b = datetime.datetime(2018, 10, 28, 7, 26, 30)

a = a.replace(tzinfo=timezone("UTC"))
b = b.replace(tzinfo=timezone("America/Edmonton"))

a = a.astimezone(timezone("America/Edmonton"))
b = b.astimezone(timezone("America/Edmonton"))

print(repr(a))
# Result: datetime.datetime(2018, 10, 28, 7, 26, 30, tzinfo=<DstTzInfo 'America/Edmonton' MDT-1 day, 18:00:00 DST>)

print(repr(b))
# Result: datetime.datetime(2018, 10, 28, 7, 26, 30, tzinfo=<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>)

a == b # Results in False for some reason

Что такое "MDT-1 day, 18:00:00 DST" против "LMT-1 day, 16:26:00 STD"? Почему они разные? Что я делаю не так?

1 Ответ

0 голосов
/ 29 октября 2018

Правильный способ сделать это выглядит так:

import datetime
from pytz import timezone

a = datetime.datetime(2018, 10, 28, 13, 26, 30)
b = datetime.datetime(2018, 10, 28, 7, 26, 30)

a = timezone('UTC').localize(a)
b = timezone('America/Edmonton').localize(b)

a == b

Как показано здесь . В результате a будет равно b. Все еще не уверен, почему кажется, что pytz по умолчанию использует систему до 1893 года.

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