2010-04-17 123 views
12

如果我將UTC日期時間轉換爲瑞典格式,則包含夏令時(CEST)。但是,在使用瑞典作爲時區創建日期時,它將獲得CET而不是CEST。爲什麼是這樣?使用pytz時區時不包括DST的Python日期時間

>>> # 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>) 
>>> 

回答

11

sweden對象默認情況下指定CET時區,但包含足夠的信息來了解CEST啓動時和停止。

在第一個示例中,您將創建一個datetime對象並將其轉換爲本地時間。 sweden對象知道您通過的UTC時間是在夏令時期間發生的,並且可以對其進行適當的轉換。

在第二個示例中,datetime構造函數始終將您的輸入解釋爲not-daylight-savings-time並返回適當的對象。

如果datetime將您的輸入作爲掛鐘時間處理併爲您選擇適當的夏令時設置,那麼在一年中的時鐘設置回退時會出現模糊現象。在掛鐘上,同一小時發生兩次。因此,datetime強制您指定創建datetime對象時使用的時區。

+0

感謝您的信息!此外,pytz.timezone對象的本地化函數可用於構建本地化日期時間,而不是日期時間(...,tzinfo = ) – Jesper 2010-04-17 23:42:33

+4

@Jesper:[pytz docs](http://pytz.sf.net )明確地說,使用.localize()而不是使用datetime構造函數的tzinfo參數用於帶DST的時區。 – jfs 2012-12-12 16:20:59

0

時區縮寫不是唯一的。例如「IST」可以指「愛爾蘭標準時間」,「伊朗標準時間」,「印度標準時間」或「Isreali標準時間」。你不應該依賴解析,而應該使用zoneinfo時區。