Часовые пояса и смещения меняются с годами. Имя зоны по умолчанию и смещение, предоставляемые при создании pytz объекта timezone, являются самыми ранними из доступных для этой зоны, и иногда они могут показаться странными. Когда вы используете localize для привязки зоны к дате, заменяются правильное название зоны и смещение. Простое использование datetime конструктора для привязки зоны к дате не позволяет ее корректно настроить.
Ответ 2
Придя сюда почти 10 лет спустя, я думаю, стоит отметить, что теперь мы можем использовать исключительно стандартную библиотеку Python 3.9+ для обработки часовых поясов без "ловушки локализации".
Используйте модуль zoneinfo для установки и замены tzinfo так, как вам нравится, например:
from datetime import datetime from zoneinfo import ZoneInfo
hk = ZoneInfo('Asia/Hong_Kong') print(repr(hk)) # zoneinfo.ZoneInfo(key='Asia/Hong_Kong')
вы также могли бы использовать dateutil, который следует той же семантике, что и zoneinfo
Примечание для pandas пользователей:
pandas (версия 1.4.1) все еще используется pytz внутренне и, похоже, у возникают некоторые проблемы с объектами часового пояса ZoneInfo
Ответ 3
Хотя я уверен, что исторические изменения в часовых поясах являются фактором, передача объекта pytz timezone конструктору DateTime приводит к странному поведению даже для часовых поясов, которые не претерпевали изменений с момента их создания.