pytz - 在 python 中,pytz在转换时出现意外结果

  显示原文与译文双语对照的内容
116 5

我正在理解为什么将时区转换为UTC时得到以下结果:

In [74]: d1 = datetime(2007, 12, 5, 6, 30,tzinfo=pytz.timezone('US/Pacific'))
In [75]: d1
Out[75]: datetime.datetime(2007, 12, 5, 6, 30, tzinfo=<DstTzInfo 'US/Pacific' LMT-1 day, **16:07:00 STD**>)
In [76]: d1.astimezone(pytz.utc)
Out[76]: datetime.datetime(2007, 12, 5, 14, 23, tzinfo=<UTC>)

为什么 6: 30am成为 2: 23pm?

另一方面,如果使用以下方法,则得到预期结果:

In [90]: d2 = datetime(2007, 12, 5, 6, 30)
In [91]: uspac = pytz.timezone('US/Pacific')
In [92]: d2_aware = uspac.localize(d2)
In [94]: d2_aware.astimezone(pytz.utc)
Out[94]: datetime.datetime(2007, 12, 5, 14, 30, tzinfo=<UTC>)
时间:原作者:0个回答

145 3

从部分文档中:http://pytz.sourceforge.net/#localized-times-and-date-arithmetic

不幸的是,使用标准日期时间构造函数''的tzinfo参数不能与许多时区pytz工作''。不过,对于时区来说,如果没有夏令时,[...] 是安全的,比如 UTC 。[...] 是处理时间的首选方法,只有在生成输出时,才能通过UTC转换。

原作者:
90 5

我得到的只是一个解决办法,简单的规则是使用 datetime() 创建时区信息。

这里示例将为你提供以下提示。如你所见,你可以以避免意外的差异,一次只能使"天真"日期时间( 。是,不带时区信息的datetime ),然后本地化它:

import pytz
from datetime import datetime
# make Jan 1 on PDT -> UTC
pdt = pytz.timezone("America/Los_Angeles")
pdtnow1 = datetime(2014,1,1, tzinfo=pdt)
pdtnow2 = pdt.localize(datetime(2014,1,1))
pytz.utc.normalize(pdtnow1)
#> datetime.datetime(2014, 1, 1, 7, 53, tzinfo=<UTC>)
pytz.utc.normalize(pdtnow2)
#> datetime.datetime(2014, 1, 1, 8, 0, tzinfo=<UTC>)
# make Jan 1 on UTC -> PDT
utcnow1 = datetime(2014,1,1, tzinfo=pytz.utc)
utcnow2 = pytz.utc.localize(datetime(2014,1,1))
pdt.normalize(utcnow1)
#> datetime.datetime(2013, 12, 31, 16, 0, 
#> tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
pdt.normalize(utcnow2)
#> datetime.datetime(2013, 12, 31, 16, 0, 
#> tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
原作者:
...