【问题标题】:Why does creating a datetime with a tzinfo from pytz show a weird time offset?为什么使用 pytz 的 tzinfo 创建日期时间会显示奇怪的时间偏移?
【发布时间】:2018-01-27 01:30:21
【问题描述】:

谁能解释一下为什么我没有得到相同的结果?

import datetime,pytz
var1 = datetime.datetime(2017,10,25,20,10,50,tzinfo=pytz.timezone("Europe/Athens")))
print(var1)

这段代码的输出是:2017-10-25 20:10:50+01:35

import datetime,pytz
var1 = datetime.datetime(2017,10,25,20,10,50)
var1 = pytz.timezone("Europe/Athens").localize(var1)
print(var1)

这段代码的输出是:2017-10-25 20:10:50+03:00

我的问题是为什么他们有不同的时区(1:35 和 3:00)。我知道第二个代码是正确的,因为我的 UTC 是 3:00。但是你能告诉我为什么我在第一个得到1:35 吗?

【问题讨论】:

  • 您在第二个示例中调用localize,而不是在第一个示例中。鉴于我预计会有差异,特别是考虑到pytz 的文档:这个库只支持两种构建本地化时间的方法。第一种是使用localize()[...]第二种构建本地化时间的方法是使用标准astimezone()转换现有的本地化时间
  • @KwnstantinosNikoloutsos 找到适合您的答案后,请单击该答案旁边的勾号以接受它。这可以让其他有您问题的人知道哪种解决方案适合您。
  • @AdiC 好的,等待更多人看到并写下,以解决我面临的问题。

标签: python datetime timezone pytz


【解决方案1】:

tzinfo 不适用于某些时区,这可能是导致错误结果的原因。
pytz doc

不幸的是,在许多时区使用标准日期时间构造函数的 tzinfo 参数“不起作用”。

使用localizeastimezone 可以解决此问题。 Doc 说 处理时间的首选方式是始终使用 UTC,仅在生成供人类读取的输出时转换为本地时间

import datetime, pytz
localTimezone = pytz.timezone('Europe/Athens')
var1 = datetime.datetime(2017,10,25,20,10,50,tzinfo=pytz.utc) 
loc_dt = var1.astimezone(localTimezone)
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
print(loc_dt.strftime(fmt))  

这将打印出来

2017-10-25 23:10:50 EEST+0300

【讨论】:

    【解决方案2】:

    没问题,datetime 只是高兴地报告tzinfo 在任何参考框架中的偏移量。

    默认情况下,pytz.timezone 不提供 UTC 偏移量,而是提供 LMT (local mean time) 偏移量:

    >>> pytz.timezone("Europe/Athens")
    <DstTzInfo 'Europe/Athens' LMT+1:35:00 STD>
    #                          ^^^-------------------- local mean time
    

    但是,当您对其进行本地化时:

    >>> var1 = datetime.datetime(2017,10,25,20,10,50)
    >>> var1 = pytz.timezone("Europe/Athens").localize(var1)
    >>> var1.tzinfo
    <DstTzInfo 'Europe/Athens' EEST+3:00:00 DST>
    #                          ^^^^-------------------- eastern european summer time
    

    现在报告了不同的偏移量,这一次基于 EEST。

    【讨论】:

      【解决方案3】:

      在第二个代码中,您使用.localize(),它接受一个简单的日期时间对象并将其解释为就好像它在那个时区中一样。它不会将时间移动到另一个时区。一个简单的 datetime 对象没有时区信息可以使移动成为可能。

      当您正在在第二个代码中设置本地时间时,第二个代码中显示的时间是正确的。由于您没有在第一个代码中设置本地时间,因此显示的时间不正确。

      【讨论】:

      • 感谢您的快速回复,您对第二个示例是正确的。但我的问题是第一个示例而不是第二个示例。
      • @KwnstantinosNikoloutsos 他正在解释为什么您在第一个示例中遇到问题:没有在您的 datetime 对象上调用 localize
      • @Adonis Bingo!我已经编辑了我的答案以包含它
      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2014-07-05
      • 2015-05-13
      • 1970-01-01
      • 2020-04-12
      • 2012-05-05
      • 2014-11-23
      • 2017-01-01
      相关资源
      最近更新 更多