我在这里查看了几个与pytz
相关的问题,但似乎都没有解决我所看到的确切问题。
在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
。事实上,即使它知道DST偏移,我也无法让Python在EDT
中声明悉尼:
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中纠正的已知问题吗? (我说它使用OLSON_VERSION = '2010b'
。)
答案 0 :(得分:4)
IANA维护着Olson数据库。在IANA的mailing list here中讨论了应该为澳大利亚使用什么时区缩写的问题(讨论跨越了两个月:March 2013,April 2013)。< / p>
各方似乎都强烈反对缩写应该是什么,而那些强烈的意见导致了僵局。
Some say the abbreviations are a relic of the past并且不应该使用,并且不应修复歧义以帮助阻止其使用。
显然,澳大利亚没有公认的权限来定义缩写。 Some say conflicting organizations use different timezone abbreviations,为了不选择政治方面,IANA选择EST进行标准和夏令时。
目前,Olson 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。