Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么pytz能够正确调整时间和时间;穿越TZ&;DST边界,但不是TZ名称?_Python_Datetime_Timezone_Dst_Pytz - Fatal编程技术网

Python 为什么pytz能够正确调整时间和时间;穿越TZ&;DST边界,但不是TZ名称?

Python 为什么pytz能够正确调整时间和时间;穿越TZ&;DST边界,但不是TZ名称?,python,datetime,timezone,dst,pytz,Python,Datetime,Timezone,Dst,Pytz,我在这里回顾了几个与pytz相关的问题,但似乎没有一个能解决我所看到的确切问题 下面是一个循环,用于在多个时区中打印当前时间,包括时区偏移量、时区名称以及datetime对象是否认为它是DST nowDT = datetime.datetime.now() chicagoTz = pytz.timezone('America/Chicago') chicagoDT = chicagoTz.normalize(chicagoTz.localize(nowDT)) sys.stdout.write(

我在这里回顾了几个与pytz相关的问题,但似乎没有一个能解决我所看到的确切问题

下面是一个循环,用于在多个时区中打印当前时间,包括时区偏移量、时区名称以及
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
例如,通过检查,我们发现所有这些信息都是正确的,包括悉尼时间、偏移量和
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
在我的系统上是否过期?这是在最近版本的
pytz
或Olson DB中纠正的已知问题,而我可能没有?(我的说它正在使用
OLSON\u VERSION='2010b'

维护OLSON数据库。IANA的tz中讨论了澳大利亚应使用什么时区缩写的问题(讨论持续了两个月:,)

各方似乎都对缩略语应该是什么有强烈的意见,这些强烈的意见导致了僵局

不应使用,也不应固定歧义来阻止其使用

显然,澳大利亚没有公认的权威机构对缩写进行定义,为了避免选择政治立场,IANA在标准时间和夏令时都选择了EST

目前,奥尔森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用于跨越每个过渡边界。

维护奥尔森数据库。IANA的tz中讨论了澳大利亚应使用什么时区缩写的问题(讨论持续了两个月:,)

各方似乎都对缩略语应该是什么有强烈的意见,这些强烈的意见导致了僵局

不应使用,也不应固定歧义来阻止其使用

显然,澳大利亚没有公认的权威机构对缩写进行定义,为了避免选择政治立场,IANA在标准时间和夏令时都选择了EST

目前,奥尔森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被用于跨越每个过渡边界。

祝一群试图改革公共惯例的数据库维护者好运。假设这种做法在澳大利亚和美国一样普遍。为了清楚起见(如果你可以这样称呼的话),在夏季,澳大利亚东部时区使用“东部夏季时间”而不是“东部标准时间”,因此使用了两个“EST”缩写。持续不断的争论是是否将其称为EST、EDT、AEST或AEDT。祝一群试图改革公共实践的数据库维护人员好运。假设这种做法在澳大利亚和美国一样普遍。为了清楚起见(如果你可以这样称呼的话),在夏季,澳大利亚东部时区使用“东部夏季时间”而不是“东部标准时间”,因此使用了两个“EST”缩写。持续的争论是,是否将其称为EST、EDT、AEST或AEDT。使用
tz.localize(naive_dt,is_dst=None)
,除非您希望对不明确或不存在的本地时间默认为
is_dst=False
。谢谢。这就是周围的
normalize
的目的——为讨论中的日期/时间适当地设置DST;这是模棱两可的:
tz.normalize()
无法修复它(如果它可以的话)。localize()本身就能做正确的事情。)@J.F.Sebastian哦,我明白你的意思了。感谢您的提示。请使用
tz.localize(naive_dt,is_dst=None)
,除非您希望对不明确或不存在的本地时间默认为
is_dst=False
。谢谢。这就是周围的
normalize
的目的——为讨论中的日期/时间适当地设置DST;这是模棱两可的:
tz.normalize()
无法修复它(如果它可以的话)。localize()本身就能做正确的事情。)@J.F.Sebastian哦,我明白你的意思了。谢谢你的提示。