我已在這裏查看了幾個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'
。)
使用'tz.localize(naive_dt,is_dst = None)',除非你想爲不明確或不存在的本地時間默認爲'is_dst = False'。 – jfs
謝謝。這就是周圍的「normalize」的意思 - 爲所討論的日期/時間適當地設置DST。如果時間不明確,則爲 – dg99
;它是不明確的:'tz.normalize()'不能修復它(如果它可以''.localize()'會自己做正確的事情)。 – jfs