Python datetime без учета летнего времени при использовании pytz timezone - PullRequest
13 голосов
/ 18 апреля 2010

Если я конвертирую дату и время по Гринвичу в шведский, включается летнее время (CEST). Однако при создании даты и времени со Швецией в качестве часового пояса он получает 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>)
>>>

Ответы [ 2 ]

12 голосов
/ 18 апреля 2010

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

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

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

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

0 голосов
/ 09 ноября 2010

Сокращения часовых поясов не являются уникальными. Например, «IST» может относиться к «ирландскому стандартному времени», «иранскому стандартному времени», «индийскому стандартному времени» или «стандартному времени Израиля». Вы не должны полагаться на это, а вместо этого должны использовать часовые пояса zoneinfo.

...