Python时区偏移错误?

7
我正在编写一个Python脚本,其中包含两行代码,将传递到方法中的日期转换为UTC时间:
print "Timezone: %s" % get_localzone()
date = datetime.now(tz=get_localzone())
print "Local time: %s" % date
utc = pytz.utc
utc_date = date.astimezone(utc)
print "UTC date: %s" % utc_date

并且结果是:
Timezone: America/Chicago
Local time: 2015-06-17 14:58:45.224827-05:00
UTC date: 2015-06-17 19:58:45.224827+00:00

正如您所看到的,本地时间的偏移量为“-05:00”,没有任何问题,但当我使用相同时区创建自定义日期时间对象时:

date = datetime(2015, 6, 17, 14, 58, 45, tzinfo=get_localzone())

结果变成了:
Timezone: America/Chicago
Local time: 2015-06-17 14:58:45-05:51

偏移量从"-05:00"变为"-05:51"。我甚至使用了第一个"datetime.now()"生成的相同时间,时区也没有改变,有人能解释一下这是为什么吗?谢谢!

1个回答

10

不要使用tzinfo参数,而是使用pytz库中的localize方法。

tz = get_localzone()
date = tz.localize(datetime(2015, 6, 17, 14, 58, 45))

这个问题在pytz文档中被广泛讨论,从第一个“注意”框开始,并在第一个代码示例中提到。

tzlocal文档中也有所展示,这也是您的get_localzone()方法(我假设)来自的地方。

顺便说一下,-05:51偏移量来自America/Chicago时区的原始LMT值,即-05:50:36,并假定它早在1883年如此显示。 它被舍入到最接近的一分钟,从而在Python中得到-05:51 LMT值。 由于没有调用本地化方法,因此您会看到该偏移量,因此pytz只是使用该时区条目已知的第一个偏移量。


感谢您详细的回答,解决了我的问题 :) - YueQi Li
1
@YueQiLi:注意:应该使用 datetime.now(tz) 而不是 tz.localize(datetime.now())。后者可能会在本地时间模糊不清(例如,在夏令时转换期间)时失败。如果输入的时间不是现在,那么可以将 is_dst 参数传递给 tz.localize() 来消除歧义。 - jfs
@J.F.Sebastian 谢谢,我刚刚查看了 pytz文档,你是对的,我会将其添加到我的代码中。关于另一个类似的问题,尽管我们两个问题都是由于错误使用datetime构造函数引起的,但对于像我这样的初学者来说,将它们归类为同一种类型的问题仍然很困难。保留我的问题将有助于其他人避免这种新手错误 :) - YueQi Li
@YueQiLi:重复问题不会被删除。您的帖子将被保留作为标志性帖子。重复问题是关于在一个地方合并答案的,例如,在将来可能会自动调用localize()的类似物中:在单个位置更新信息更容易(尽管已经在文档的顶部回答了这个常见问题)。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接