Ответ 1
Используйте tz.localize(d)
для локализации экземпляра. Из документации:
Первый заключается в использовании метода localize(), предоставляемого библиотекой pytz. Это используется для локализации наивного datetime (datetime без информации о часовом поясе):
>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0)) >>> print(loc_dt.strftime(fmt)) 2002-10-27 06:00:00 EST-0500
Если вы не используете tz.localize()
, но используете datetime.replace()
, скорее всего, используется историческое смещение; tz.localize()
выберет правильное смещение, действующее на заданную дату. Например, даты начала и окончания летнего времени в Восточном часовом поясе США со временем менялись.
Когда вы пытаетесь локализовать значение datetime, которое является неоднозначным, поскольку оно охватывает переходный период от летнего времени до зимы или наоборот, с часовым поясом будет проконсультироваться, чтобы увидеть, должен ли результирующий объект datetime иметь .dst()
вернуть True или Ложь. Вы можете переопределить значение по умолчанию для часового пояса с помощью аргумента is_dst
ключевого слова для .localize()
:
dt = tz.localize(naive, is_dst=True)
или вообще отключите выбор, установив is_dst=None
. В этом случае или в редких случаях по умолчанию для часового пояса не задано значение, двусмысленное значение datetime приведет к возникновению исключения AmbiguousTimeError
. Флаг is_dst
используется только для значений неопределенного времени, которые неоднозначны и в противном случае игнорируются.
Чтобы вернуться в другую сторону, верните объект, ориентированный на часовой пояс, на наивный объект, используйте .replace(tzinfo=None)
:
naivedt = awaredt.replace(tzinfo=None)