为什么不正确调整时间偏移量?

2024-09-30 16:41:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在这里回顾了几个与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()) )

输出如下:

^{pr2}$

例如,通过检查timeanddate.com,我们可以看到所有这些信息都是正确的,包括悉尼时间、偏移量和1:00:00表示datetime对象认为DST在悉尼有效。在

唯一的问题是悉尼时间被标记为EST,而不是EDT。实际上,我无法让Python在EDT中声明Sydney,即使它知道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是否过期?{ol1}最新版本的CDDB可能没有更正?(我的说它在使用OLSON_VERSION = '2010b'。)


Tags: datetimestdoutsys时间tz偏移量dstest
1条回答
网友
1楼 · 发布于 2024-09-30 16:41:44

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选择了EST作为标准时间和夏令时。在

目前,奥尔森数据库在澳大利亚/悉尼的所有时区使用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用于跨越每个过渡边界。在

相关问题 更多 >