【问题标题】:Wrong time delta calculation in python datetime packagepython datetime包中的错误时间增量计算
【发布时间】:2023-02-17 00:20:57
【问题描述】:

我想计算夏令时发生时的时差。 今年,夏令时将在欧洲/阿姆斯特丹时区的 3 月 26 日之后开始。
所以我预计 2023 年 3 月 26 日 8 点到 2023 年 3 月 25 日 8 点之间的时间差不是 24 小时。
但下面的计算显示 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) 

预计为 23 小时,但显示为 24 小时。

我尝试使用pytzpendulum,结果是一样的。

我将这两个时间点转换为 UTC,或者只使用 unix 时间戳,正如我预期的那样,我得到了 23 小时。

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

【问题讨论】:

    标签: python datetime timedelta


    【解决方案1】:

    指定 tzinfo 不会正确创建时区感知日期时间对象。您需要通过timezone.localize 传递不识别时区的日期时间对象。

    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((a2 - a1).total_seconds() / 3600) # 23.0
    

    【讨论】:

      猜你喜欢
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      相关资源
      最近更新 更多