为什么在Python中使用www.example.com或timezone对象时,跨夏令时的时间增量计算会有所不同dateutil.tz?

xpcnnkqh  于 2023-06-04  发布在  Python
关注(0)|答案(1)|浏览(149)

我正在学习Python中的时区和夏令时。当我用两种方法计算夏令时前后的时差时,它们应该给予相同的时差,但是它们给出了不同的结果。

from datetime import datetime, timedelta, timezone
from dateutil import tz

1.第一种方法使用dateutil.tz

eastern = tz.gettz('America/New_York')
t1 = datetime(2017, 3, 12, 1, 59, 59, tzinfo=eastern)
t2 = datetime(2017, 3, 12, 3, 0, 0, tzinfo=eastern)
print(t1.isoformat())
print(t2.isoformat())
print((t2-t1).seconds)

输出为:
2017-03-12T01:59:59-05:00
2017-03-12T03:00:00-04:00
3601
1.手动设置时区的第二种方法

EST = timezone(timedelta(hours=-5))
EDT = timezone(timedelta(hours=-4))
spring_ahead_159am = datetime(2017, 3, 12, 1, 59, 59, tzinfo = EST)
spring_ahead_3am = datetime(2017, 3, 12, 3, 0, 0, tzinfo = EDT)

print(spring_ahead_159am.isoformat())
print(spring_ahead_3am.isoformat())
print((spring_ahead_3am - spring_ahead_159am).seconds)

输出为:
2017-03-12T01:59:59-05:00
2017-03-12T03:00:00-04:00
1
如图所示,t1等于spring_ahead_159am,t2等于spring_ahead_3am。那么(t2 - t1)是怎么来的呢!=(spring_ahead_3am - spring_ahead_159am)?
我比较了它们,它们是相等的:

print(t1 == spring_ahead_159am)
print(t2 == spring_ahead_3am )

输出为:
真的
真的

z2acfund

z2acfund1#

由于datetime__sub__()方法的实现(链接到github),这似乎是无意的行为。当您减去两个日期时间对象时,它会检查时区是否是同一个对象。

if self._tzinfo is other._tzinfo:
    return base

由于从dateutil传递到t1t2的tz对象是同一个对象,因此datetime对象假定时区保持不变,并且不考虑夏令时。
这似乎是一个bug,你绝对应该打开一个github issue

相关问题