Python datetime не включва DST при използване на pytz часова зона

Ако конвертирам UTC дата и час в шведски формат, лятното време е включено (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>)
>>>

person Jesper    schedule 17.04.2010    source източник


Отговори (2)


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

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

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

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

person Daniel Stutzbach    schedule 17.04.2010
comment
Благодаря за информацията! Освен това функцията за локализиране на обект pytz.timezone може да се използва за изграждане на локализираната дата и час вместо datetime(..., tzinfo=‹tz›) - person Jesper; 18.04.2010
comment
@Jesper: pytz docs изрично казват да се използва .localize() вместо конструктор datetime с параметър tzinfo за часова зона с DST . - person jfs; 12.12.2012

Съкращенията на часовите зони не са уникални. Например „IST“ може да се отнася до „Ирландско стандартно време“, „Иранско стандартно време“, „Индийско стандартно време“ или „Израелско стандартно време“. Не трябва да разчитате на анализиране на това и вместо това трябва да използвате часови зони zoneinfo.

person Rory    schedule 09.11.2010