Подтвердить что ты не робот

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>)
>>>
4b9b3361

Ответ 1

Объект sweden задает часовой пояс CET по умолчанию, но содержит достаточно информации, чтобы знать, когда CEST запускается и останавливается.

В первом примере вы создаете объект datetime и преобразуете его в локальное время. Объект sweden знает, что время UTC, которое вы прошли, происходит во время летнего времени и может соответствующим образом преобразовать его.

Во втором примере конструктор datetime всегда интерпретирует ваш вход как не-дневное время сбережения и возвращает соответствующий объект.

Если datetime обработал ваш вход в качестве времени настенных часов и выбрал подходящий для вас режим экономии дневного света, в течение года, когда часы будут установлены назад, возникнет двусмысленность. На настенные часы тот же час происходит дважды. Следовательно, datetime заставляет вас указать, какой часовой пояс вы используете при создании объекта datetime.

Ответ 2

Аббревиатуры часовых поясов не уникальны. Например, "IST" может относиться к "ирландскому стандартному времени", "иранскому стандарту времени", "индийскому стандарту времени" или "стандартное время Isreali". Вы не должны полагаться на синтаксический анализ этого, и вместо этого должны использовать zoneinfo timezones.