我正在学习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 )
输出为:
真的
真的
1条答案
按热度按时间z2acfund1#
由于
datetime
的__sub__()
方法的实现(链接到github),这似乎是无意的行为。当您减去两个日期时间对象时,它会检查时区是否是同一个对象。由于从
dateutil
传递到t1
和t2
的tz对象是同一个对象,因此datetime
对象假定时区保持不变,并且不考虑夏令时。这似乎是一个bug,你绝对应该打开一个github issue。