2012-10-09 26 views
5

可能重複:
Weird timezone issue with pytzPYTZ「美國/埃德蒙頓偏移錯誤

這似乎是錯誤的:

>>> import pytz 
>>> z1 = timezone('America/Edmonton') 
>>> z2 = timezone('US/Mountain') 
>>> z1 
<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD> 
>>> z2 
<DstTzInfo 'US/Mountain' MST-1 day, 17:00:00 STD> 
>>> pytz.VERSION 
'2012f' 
>>> 

'美國/埃德蒙頓' 和「美國/東部'應該是同一時區(17:00:00 STD)。更何況16:26:00沒有任何意義。

- 更新-

上述在Jon Skeet的回答中是有意義的。然而,當我這樣做的事情變得奇怪:

>>> d = datetime.now() 
>>> d 
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706) 

我創建了一個天真的日期。由於「美國/埃德蒙頓我的時區,我嘗試手動設置:

​​

這應該不會改變任何東西,因爲這是正確的TZ。但是:

>>> d2.astimezone(timezone('US/Eastern')) 
datetime.datetime(2012, 10, 9, 18, 55, 41, 644706, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>) 

這應該給我2個小時(「美國/東方」和「美洲/埃德蒙頓」之間的差值)偏移,但它給了我3小時26分(其中有2小時一個小時26分鐘:D)

插入timezone('US/Mountain')astimezone()中產生正確的結果。使用'America/Edmonton'創建一個有意識的日期時間也可以正常工作。

+0

會發生什麼事,當你構建'datetime'與在場的時區與啓動,而不是使用'replace'? (它確實看起來像是基本上壞了......) –

+0

然後它工作正常。可悲的是,這不是我的選擇,因爲天真的日期時間是由另一個函數返回的,我無法控制:( – Goro

回答

9

documentation for pytz明確指出直接從時區創建日期時間將不起作用所有的情況下,並指導您這樣做,而不是執行以下操作:

d2 = timezone('America/Edmonton').localize(d) 
+1

之上啊。 RTFM :) – Goro

3

望着2012c TZDB數據,這裏的規則對美國/埃德蒙頓設置:

Zone America/Edmonton -7:33:52 -  LMT 1906 Sep 
         -7:00 Edm  M%sT 1987 
         -7:00 Canada M%sT 

目前尚不清楚對我的Python輸出正試圖向您展示了偏移/名稱是什麼日期/時間,但我嫌疑人它是像1900年 - 在這種情況下,16:26:00與-7:33:52的偏移量有一定意義,它也會匹配縮寫。

因此,時區數據沒有問題是完全可行的,它只是選擇向您顯示奇數日期/時間作爲示例。 (對我來說,一個時區的字符串輸出顯示時間根本沒有意義,說實話...)

+2

)直到您嘗試將時區附加到日期/時間,它才顯示它包含的最早定義 –

+0

@MarkRansom:那肯定會解釋一下,是的... –

+0

啊,那就有道理了。不過,當我嘗試使用astimezone()時,我仍然會看到奇怪的東西 - 當然,這些都在 – Goro