【问题标题】:Python datetime object show wrong timezone offsetPython datetime 对象显示错误的时区偏移
【发布时间】:2011-09-18 15:39:20
【问题描述】:

我正在尝试使用 datetime 和 pytz 在 python 中创建一个 datetime 对象,显示的偏移量是错误的。

import datetime
from pytz import timezone

start = datetime.datetime(2011, 6, 20, 0, 0, 0, 0, timezone('Asia/Kolkata'))
print start

显示的输出是

datetime.datetime(2011, 6, 20, 0, 0, tzinfo=<DstTzInfo 'Asia/Kolkata' HMT+5:53:00 STD>)

请注意,“亚洲/加尔各答”是 IST,即 GMT+5:30 而不是 HMT+5:53。这是一个标准的 linux 时区,为什么会出错,如何解决?

【问题讨论】:

  • @kojiro:这不是错误。见pytz.sourceforge.net
  • @FerdinandBeyer 当你写评论时它不是一个错误,但现在它是。 datetime 接口现在可以正常工作,Python 3.9 中引入的zoneinfo module 就是证明——它不需要localize 函数才能正常工作。

标签: python datetime pytz


【解决方案1】:

见:http://bytes.com/topic/python/answers/676275-pytz-giving-incorrect-offset-timezone

在 cmets 中,有人建议使用 tzinfo.localize() 而不是 datetime 构造函数,这可以解决问题。

>>> tz = timezone('Asia/Kolkata')
>>> dt = tz.localize(datetime.datetime(2011, 6, 20, 0, 0, 0, 0))
>>> dt
datetime.datetime(2011, 6, 20, 0, 0, tzinfo=<DstTzInfo 'Asia/Kolkata' IST+5:30:00 STD>)

更新:实际上,official pytz website 声明您应该始终使用localizeastimezone 而不是将时区对象传递给datetime.datetime

【讨论】:

  • 非常感谢。
  • 这太疯狂了。谢谢你的回答。
  • 字节链接中的解释非常棒,谢谢!
  • 这个答案可以通过添加一个小推理来改进,为什么pytz 默认使用带有分钟偏移的极其罕见的时区,并且在使用方法.localize() 时不使用它们。这太奇怪了。
  • @Alfe 我认为没有人知道为什么 pytz 使用它的默认值。我的猜测是,默认值是其表中最旧的条目,而不是更可能是正确的最新条目。当你没有使用localize 时,这可能是故意让它变得明显。 localize 可以正常工作的原因是因为它传递了日期时间,因此它可以使用它来确定正确的历史上下文并进行调整。 Python 3.9 中添加的zoneinfo 模块不需要localize,我认为是因为datetime 已更改为更好地支持它。
猜你喜欢
  • 2015-09-03
  • 1970-01-01
  • 2014-08-14
  • 2017-03-26
  • 2021-09-17
  • 2020-06-11
  • 1970-01-01
  • 2013-01-21
相关资源
最近更新 更多