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

2024-10-02 14:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我原以为接下来的两个会给出相同的结果,但他们没有。为什么会这样?你知道吗

版本:

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(这是错误的)


Tags: import版本todaydatetimetzutcprinttimezone
1条回答
网友
1楼 · 发布于 2024-10-02 14:23:47

你发现了一个bug in ^{},我现在已经报告了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在引擎盖下调用^{},而isoformat调用^{}dateutil以UTC和本地时间存储转换时间,UTC时间用于fromutc,本地时间用于utcoffsetdsttzname。这个bug涉及到在DST->;DST转换(非常罕见)期间计算转换的“墙时间”时对DST的过度补偿,这就是它不影响astimezone的原因。你知道吗

底线-您正确地使用了pytzdateutil,这个错误将在下一个版本中修复。你知道吗

注意:这个答案是在我找到错误的原因和修复之后编辑的。你知道吗

相关问题 更多 >