python datetime包中的时间增量计算错误

ruarlubt  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(109)

您期望的价值是什么
一个月一个月-一个月一个月
阿姆斯特丹自2023年3月26日起开始实行夏令时,因此3月25日为UTC+1,3月26日为UTC+2,直观上为23 hours25 hours,但由于夏令时的变化而不是24 hours
但下面的计算显示为24小时,这是为什么呢?
我的python版本是3.9.6

from datetime import datetime, timedelta
import pendulum

p1 = datetime(year=2023, month=3, day=25, hour=8, minute=0, tzinfo=pendulum.timezone('Europe/Amsterdam')) # No DST
p2 = datetime(year=2023, month=3, day=26, hour=8, minute=0,  tzinfo=pendulum.timezone('Europe/Amsterdam')) # DST

print((p2 - p1).total_seconds()/3600)

我尝试使用pytzpendulum,结果是一样的,24小时。
我将这两个时间点转换为UTC,或者只使用UNIX时间戳,我得到了23个小时,正如我所期望的。

(p2.astimezone(pendulum.timezone('UTC')) -  p1.astimezone(pendulum.timezone('UTC'))).total_seconds()/3600

或者

(p2.timestamp() - p1.timestamp())/3600
ekqde3dh

ekqde3dh1#

指定tzinfo并不能为具有夏令时转换的时区正确创建时区感知datetime对象请参阅文档。打印p1p2repr显示p1p2具有相同的时区:

print(repr(p1))
# datetime.datetime(2023, 3, 25, 8, 0, tzinfo=<DstTzInfo 'Europe/Amsterdam' LMT+0:18:00 STD>)
 
print(repr(p2))
# datetime.datetime(2023, 3, 26, 8, 0, tzinfo=<DstTzInfo 'Europe/Amsterdam' LMT+0:18:00 STD>)

您需要通过timezone.localize传递不识别时区的datetime对象。

import pytz

tz = pytz.timezone('Europe/Amsterdam')

u1 = datetime(year=2023, month=3, day=25, hour=8, minute=0)
u2 = datetime(year=2023, month=3, day=26, hour=8, minute=0)

a1 = tz.localize(u1)
a2 = tz.localize(u2)

print(repr(a1))
# datetime.datetime(2023, 3, 25, 8, 0, tzinfo=<DstTzInfo 'Europe/Amsterdam' CET+1:00:00 STD>)

print(repr(a2))
# datetime.datetime(2023, 3, 26, 8, 0, tzinfo=<DstTzInfo 'Europe/Amsterdam' CEST+2:00:00 DST>)

print((a2 - a1).total_seconds() / 3600)
# 23.0

或者,创建pendulum.datetime对象:

p1 = pendulum.datetime(year=2023, month=3, day=25, hour=8, minute=0, tz=pendulum.timezone('Europe/Amsterdam')) # No DST
p2 = pendulum.datetime(year=2023, month=3, day=26, hour=8, minute=0,  tz=pendulum.timezone('Europe/Amsterdam')) # DST

print((p2 - p1).total_seconds()/3600)
# 23.0

相关问题