2014-03-12 50 views
2

我已在這裏查看了幾個pytz相關的問題,但似乎沒有解決我看到的確切問題。爲什麼Pytz在穿越TZ和DST界限時正確調整時間和偏移量,但不是TZ名稱?

pytz documentation,這裏有一個循環來打印多個時區,包括時區偏移量,時區名稱的當前時間,並且datetime對象是否認爲這是DST。

nowDT = datetime.datetime.now() 
chicagoTz = pytz.timezone('America/Chicago') 
chicagoDT = chicagoTz.normalize(chicagoTz.localize(nowDT)) 
sys.stdout.write("%-10s %-35s %s\n" % ('Chicago', 
             chicagoDT.strftime("%Y/%m/%d %H:%M:%S %Z %z"), 
             chicagoDT.dst())) 

tzTups = [('New York', 'America/New_York'), 
      ('London', 'Europe/London'), 
      ('Sydney', 'Australia/Sydney')] 

for tzTup in tzTups: 
    tz = pytz.timezone(tzTup[1]) 
    locDT = tz.normalize(chicagoDT.astimezone(tz)) 
    sys.stdout.write("%-10s %-35s %s\n" % (tzTup[0], 
              locDT.strftime("%Y/%m/%d %H:%M:%S %Z %z"), 
              locDT.dst())) 

下面是輸出:

Chicago 2014/03/12 14:34:53 CDT -0500  1:00:00 
New York 2014/03/12 15:34:53 EDT -0400  1:00:00 
London  2014/03/12 19:34:53 GMT +0000  0:00:00 
Sydney  2014/03/13 06:34:53 EST +1100  1:00:00 

有,比方說,timeanddate.com檢查,我們看到所有這些信息是正確的,包括悉尼時間,偏移和指示1:00:00,該datetime對象相信DST目前在悉尼生效。

唯一的問題是悉尼時間標記爲EST而不是EDT。事實上,我不能讓Python曾經宣佈悉尼EDT即使它知道的DST偏移:

tz = pytz.timezone('Australia/Sydney') 
for i in range(1,13): 
    locDT = tz.normalize(tz.localize(datetime.datetime(2013, i, 15))) 
    sys.stdout.write("%02d %s %s\n" % (i, locDT.dst(), locDT.tzname())) 

輸出:

01 1:00:00 EST 
02 1:00:00 EST 
03 1:00:00 EST 
04 0:00:00 EST 
05 0:00:00 EST 
06 0:00:00 EST 
07 0:00:00 EST 
08 0:00:00 EST 
09 0:00:00 EST 
10 1:00:00 EST 
11 1:00:00 EST 
12 1:00:00 EST 

難道我做錯了什麼? /usr/share/zoneinfo在我的系統上過時了嗎?這是在最近版本的pytz或我可能沒有的Olson DB中更正的已知問題嗎? (Mine說它使用的是OLSON_VERSION = '2010b'。)

+0

使用'tz.localize(naive_dt,is_dst = None)',除非你想爲不明確或不存在的本地時間默認爲'is_dst = False'。 – jfs

+0

謝謝。這就是周圍的「normalize」的意思 - 爲所討論的日期/時間適當地設置DST。如果時間不明確,則爲 – dg99

+1

;它是不明確的:'tz.normalize()'不能修復它(如果它可以''.localize()'會自己做正確的事情)。 – jfs

回答

4

IANA維護着Olson數據庫。在IANA的tz mailing list here(兩個月的討論:March 2013April 2013)中討論了什麼時區縮寫應該用於澳大利亞的問題。

在各方面似乎都有強烈的意見,應該是什麼縮寫,這些強烈的意見導致了僵局。

Some say the abbreviations are a relic of the past不應該使用,不應該修復歧義,以幫助阻止它的使用。

顯然在澳大利亞沒有公認的權威定義縮寫。 Some say conflicting organizations use different timezone abbreviations,爲了不挑選政治方面,IANA選擇了標準時間和夏時制時間。

目前,奧爾森DB使用EST爲在澳大利亞/悉尼所有日期所有時區:

In [60]: import pytz 
In [61]: sydney = pytz.timezone('Australia/Sydney') 

In [68]: [(date, tzabbrev) for date, (utcoffset, dstoffset, tzabbrev) in zip(sydney._utc_transition_times, sydney._transition_info)] 
Out[68]: 
[(datetime.datetime(1, 1, 1, 0, 0), 'EST'), 
(datetime.datetime(1916, 12, 31, 14, 1), 'EST'), 
(datetime.datetime(1917, 3, 24, 15, 0), 'EST'), 
(datetime.datetime(1941, 12, 31, 16, 0), 'EST'), 
(datetime.datetime(1942, 3, 28, 15, 0), 'EST'), 
(datetime.datetime(1942, 9, 26, 16, 0), 'EST'), 
(datetime.datetime(1943, 3, 27, 15, 0), 'EST'), 
...] 

In [69]: set([tzabbrev for utcoffset, dstoffset, tzabbrev in sydney._transition_info]) 
Out[69]: {'EST'} 

這表明,在澳大利亞/悉尼時區,EST跨每過渡邊界使用。

+0

祝好運數據庫維護者,試圖改革常見的公共實踐。假設澳大利亞的做法與美國一樣普遍。 –

+0

+1。爲了清楚起見(如果可以這樣稱呼的話),在夏季 - 澳大利亞東部時區使用「東部夏令時」而不是「東部標準時間」,因此是兩個「EST」縮寫。持續的爭論是是否稱之爲EST,EDT,AEST或AEDT。 –

相關問題