【问题标题】:Python datetime + pytz issuePython datetime + pytz 问题
【发布时间】:2016-06-08 11:30:56
【问题描述】:

我正在通过 strptime 创建一个日期时间对象,通过 pytz 在“欧洲/马德里”时区设置为“2016-01-02 03:04:05”。然后我将其转换为 UTC。

为什么要加 15 分钟而不是减 1 小时?

>>> import datetime
>>> import pytz
>>> d = datetime.datetime.strptime('2016-01-02 03:04:05', '%Y-%m-%d %H:%M:%S')
>>> d
datetime.datetime(2016, 1, 2, 3, 4, 5)
>>> d = d.replace(tzinfo=pytz.timezone('Europe/Madrid'))
>>> d
datetime.datetime(2016, 1, 2, 3, 4, 5, tzinfo=<DstTzInfo 'Europe/Madrid' LMT-1 day, 23:45:00 STD>)
>>> d.astimezone(pytz.utc)
datetime.datetime(2016, 1, 2, 3, 19, 5, tzinfo=<UTC>)

如果我使用“CET”而不是“Europe/Madrid”,它可以正常工作:

>>> d = d.replace(tzinfo=pytz.timezone('CET'))
>>> d
datetime.datetime(2016, 1, 2, 3, 4, 5, tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)
>>> d.astimezone(pytz.utc)
datetime.datetime(2016, 1, 2, 2, 4, 5, tzinfo=<UTC>)

编辑 1:Python 版本为 2.7.11。 pytz版本是2015.7。

编辑 2:可能的解决方案是使用 d = pytz.timezone('Europe/Madrid').localize(d) 而不是 d = d.replace(tzinfo=pytz.timezone('Europe/Madrid'))

>>> d = datetime.datetime.strptime('2016-01-02 03:04:05', '%Y-%m-%d %H:%M:%S')
>>> d
datetime.datetime(2016, 1, 2, 3, 4, 5)
>>> d = pytz.timezone('Europe/Madrid').localize(d)
>>> d
datetime.datetime(2016, 1, 2, 3, 4, 5, tzinfo=<DstTzInfo 'Europe/Madrid' CET+1:00:00 STD>)
>>> d.astimezone(pytz.utc)
datetime.datetime(2016, 1, 2, 2, 4, 5, tzinfo=<UTC>)

编辑 3:也许这是“在许多时区使用标准日期时间构造函数的 tzinfo 参数对 pytz '不起作用'”的一个实例? Source

【问题讨论】:

    标签: python datetime pytz


    【解决方案1】:

    是的,问题出在

    d.replace(tzinfo=pytz.timezone('Europe/Madrid'))
    

    它在马德里应用第一个已知的 UTC 偏移量(称为 LMT = 本地平均时间),它比 UTC 晚 15 分钟(有效期至 1900 年),或者在这种情况下表示为 -1 day +23:45

    datetime.datetime(2016, 1, 2, 3, 4, 5, tzinfo=<DstTzInfo 'Europe/Madrid' LMT-1 day, 23:45:00 STD>)
    

    使用

    pytz.timezone('Europe/Madrid').localize(d)
    

    改为:

    datetime.datetime(2016, 1, 2, 3, 4, 5, tzinfo=<DstTzInfo 'Europe/Madrid' CET+1:00:00 STD>)
    

    这将应用 2016 年有效的 UTC 偏移量,即 CE(S)T。

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 1970-01-01
      • 2021-02-04
      • 2015-06-13
      • 2012-08-30
      • 2019-04-06
      • 2021-09-19
      • 1970-01-01
      • 2019-04-16
      相关资源
      最近更新 更多