Python datetime не включает DST при использовании часового пояса pytz
Если я конвертирую дату и время UTC в шведский формат, включается летнее время (CEST). Однако, создавая datetime с sweden в качестве часового пояса, он получает CET вместо CEST. Почему это?
>>> # Modified for readability
>>> import pytz
>>> import datetime
>>> sweden = pytz.timezone('Europe/Stockholm')
>>>
>>> datetime.datetime(2010, 4, 20, 16, 20, tzinfo=pytz.utc).astimezone(sweden)
datetime(2010, 4, 20, 18, 20, tzinfo=<... 'Europe/Stockholm' CEST+2:00:00 DST>)
>>>
>>> datetime.datetime(2010, 4, 20, 18, 20, tzinfo=sweden)
datetime(2010, 4, 20, 18, 20, tzinfo=<... 'Europe/Stockholm' CET+1:00:00 STD>)
>>>
Ответы
Ответ 1
Объект sweden
задает часовой пояс CET по умолчанию, но содержит достаточно информации, чтобы знать, когда CEST запускается и останавливается.
В первом примере вы создаете объект datetime
и преобразуете его в локальное время. Объект sweden
знает, что время UTC, которое вы прошли, происходит во время летнего времени и может соответствующим образом преобразовать его.
Во втором примере конструктор datetime
всегда интерпретирует ваш вход как не-дневное время сбережения и возвращает соответствующий объект.
Если datetime
обработал ваш вход в качестве времени настенных часов и выбрал подходящий для вас режим экономии дневного света, в течение года, когда часы будут установлены назад, возникнет двусмысленность. На настенные часы тот же час происходит дважды. Следовательно, datetime
заставляет вас указать, какой часовой пояс вы используете при создании объекта datetime
.
Ответ 2
Аббревиатуры часовых поясов не уникальны. Например, "IST" может относиться к "ирландскому стандартному времени", "иранскому стандарту времени", "индийскому стандарту времени" или "стандартное время Isreali". Вы не должны полагаться на синтаксический анализ этого, и вместо этого должны использовать zoneinfo timezones.