Я не знаю почему, но это странное смещение часового пояса происходит от pytz. Смотрите код ниже:
>>>print(datetime(2019, 5, 10, tzinfo=pytz.timezone('America/Los_Angeles')))
2019-05-10 00:00:00-07:53
>>>print(pytz.timezone('America/Los_Angeles').localize(datetime(2019, 5, 10)))
2019-05-10 00:00:00-07:00
Итак, если вы пытаетесь создать дату и время и укажите tzinfo
, это создаст это смещение.
Upd.
Я проверил pytz docs и нашел следующее:
К сожалению, использование аргумента tzinfo стандартных конструкторов даты и времени "не работает" с pytz для многих часовых поясов.
...
Это безопасно для часовых поясов без переходов на летнее время, таких как UTC.
Хорошо, они говорят это, но не указывают на причину. Давайте попробуем найти это. В источниках pytz я нашел версию базы данных IANA , которую они используют:
OLSON_VERSION = '2019a'
После скачивания и распаковки этой базы данных в файле "northamerica" я нашел следующее:
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Los_Angeles -7:52:58 - LMT 1883 Nov 18 12:07:02
-8:00 US P%sT 1946
-8:00 CA P%sT 1967
-8:00 US P%sT
-7:52:58
довольно близко к -07:53
у нас.
Вывод: Где-то в pytz есть база данных, которая содержит все известные смещения часовых поясов. Когда мы передаем tzinfo в конструктор datetime, он получает первый известный часовой пояс и использует его, когда метод локализации, который вызывает replace () и передает tzinfo, каким-то образом получает правильное смещение часового пояса.
Чтобы проверить это, я нашел в том же файле другой часовой пояс:
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Toronto -5:17:32 - LMT 1895
-5:00 Canada E%sT 1919
-5:00 Toronto E%sT 1942 Feb 9 2:00s
-5:00 Canada E%sT 1946
-5:00 Toronto E%sT 1974
-5:00 Canada E%sT
А потом я запустил следующий код:
>>>print(datetime(2019, 5, 10, tzinfo=pytz.timezone('America/Toronto')))
2019-05-10 00:00:00-05:18
Как видите, результат тот же. Он использовал -5:17:32
, который является первым смещением от списка.