使用dateutil计算时区时间差时出现小时计算错误
夏令时场景下dateutil计算时间差错误的原因与解决方法
问题原因
2023年3月12日是美国东部时区(America/New_York)的夏令时切换日,当地时间凌晨2点会直接跳至3点。你直接将dateutil获取的时区对象传给datetime的tzinfo参数时,datetime并不会自动应用夏令时规则——它会把两个时间都当成固定偏移的时区(EST,-5小时)处理,导致计算出的UTC时间差为1小时1秒(即3601秒)。
而手动设置时区偏移的方式中,你给dt_300指定了EDT(-4小时),两个时间对应的UTC时间差刚好是1秒,所以结果正确。
解决方法
不要直接在datetime构造时传入tzinfo参数,改用dateutil时区对象的localize()方法来本地化时间。这个方法会根据时区的夏令时规则,自动识别对应时间的正确偏移。
修改后的代码如下:
from datetime import timedelta, datetime, timezone from dateutil import tz # 使用dateutil的localize方法处理时区 eastern = tz.gettz("America/New_York") dt_159_dateutil = eastern.localize(datetime(2023, 3, 12, 1, 59, 59)) dt_300_dateutil = eastern.localize(datetime(2023, 3, 12, 3, 0, 0)) # 手动设置偏移的对照代码 est = timezone(timedelta(hours=-5)) edt = timezone(timedelta(hours=-4)) dt_159 = datetime(2023, 3, 12, 1, 59, 59, tzinfo=est) dt_300 = datetime(2023, 3, 12, 3, 0, 0, tzinfo=edt) print((dt_300 - dt_159).seconds) # 输出 1 print((dt_300_dateutil - dt_159_dateutil).seconds) # 现在输出 1
补充说明
localize()方法会自动处理夏令时的特殊情况:比如如果你尝试本地化2023年3月12日凌晨2点的时间,它会直接抛出错误(因为这个时间在该时区不存在);而3:00的时间会被正确识别为EDT时区,1:59:59则是EST时区,两者的UTC时间差为1秒,因此计算结果正确。
内容的提问来源于stack exchange,提问作者nabaz
相关产品推荐
相关产品推荐

