gpt4 book ai didi

python - 为什么我对萨摩亚的 pytz 和 dateutil 得到不同的结果?

转载 作者:太空宇宙 更新时间:2023-11-04 02:18:14 25 4
gpt4 key购买 nike

我原以为下面两个会给出相同的结果,但他们没有。为什么会这样?

版本:

pytz==2018.5
python-dateutil==2.7.3

例子1:pytz

import datetime
import pytz

tz = pytz.timezone('Pacific/Apia')
today_utc = datetime.datetime(2011, 12, 30, 9, 59,
tzinfo=datetime.timezone.utc)
today_tz = today_utc.astimezone(tz)
print(today_tz.isoformat())

打印 2011-12-29T23:59:00-10:00(正确)

例子2:dateutil

import datetime
import dateutil.tz

tz = dateutil.tz.gettz('Pacific/Apia')
today_utc = datetime.datetime(2011, 12, 30, 9, 59,
tzinfo=datetime.timezone.utc)
today_tz = today_utc.astimezone(tz)
print(today_tz.isoformat())

打印 2011-12-29T23:59:00+14:00(这是错误的)

最佳答案

您发现了一个 bug in dateutil ,我现在已经报告和fixed .

该错误是由于在 dateutil 中如何计算转换的“墙时间”的问题引起的,它做出的一些假设在时区的基准偏移量在 DST 期间 发生变化时不成立。稍微扩展您的示例:

from datetime import datetime, timedelta
from dateutil import tz
import pytz

APIA = tz.gettz('Pacific/Apia')
APIA_p = pytz.timezone('Pacific/Apia')
dt0 = datetime.fromisoformat('2011-12-29T20:00-10:00')

for i in range(5):
dt = (dt0 + timedelta(hours=i))
dt_d = dt.astimezone(APIA)
dt_p = dt.astimezone(APIA_p)
print(f'{dt_d.isoformat()}, {dt_p.isoformat()}')

## Result:
# 2011-12-29T20:00:00-10:00, 2011-12-29T20:00:00-10:00
# 2011-12-29T21:00:00-10:00, 2011-12-29T21:00:00-10:00
# 2011-12-29T22:00:00-10:00, 2011-12-29T22:00:00-10:00
# 2011-12-29T23:00:00+14:00, 2011-12-29T23:00:00-10:00
# 2011-12-31T00:00:00+14:00, 2011-12-31T00:00:00+14:00

你可以看到dateutil总是正确计算日期和时间,但是当isoformat电话 utcoffset ,偏移量更改提前 1 小时发生。这是因为 astimezone电话 tzinfo.fromutc 在引擎盖下,同时isoformat电话 utcoffset . dateutil以 UTC 和本地时间存储转换时间,UTC 时间用于 fromutc本地时间用于utcoffset , dsttzname .此错误涉及在 DST->DST 转换期间计算转换的“挂钟时间”时对 DST 的过度补偿(这种情况极为罕见),这就是它不影响 astimezone 的原因。 .

底线 - 您同时使用了 pytzdateutil正确,此错误将在下一个版本中修复。

注意:这个答案是在我找到错误的原因并修复后编辑的。

关于python - 为什么我对萨摩亚的 pytz 和 dateutil 得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52136980/

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