gpt4 book ai didi

Python datetime + pytz 问题

转载 作者:行者123 更新时间:2023-11-28 18:32:27 24 4
gpt4 key购买 nike

我正在通过 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>)

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

>>> 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.时区('欧洲/马德里')):

>>> 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

最佳答案

是的,问题出在

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

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

关于Python datetime + pytz 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35631578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com