Python:夏令时转换期间如何仅调整dt2使dt1与dt2相等?
解决夏令时切换导致datetime对象不相等的问题
背景:2020年10月25日是欧洲伦敦夏令时结束的日期,当天时钟会从01:00回拨到00:00,使得00:00-01:00的本地时间对应两个不同的UTC时间(夏令时UTC+1、冬令时UTC+0),这就是两段代码中dt1 == dt2返回False的核心原因。
以下是针对两种场景仅调整dt2的解决方案:
场景1:对应第一段代码(dt2初始为伦敦本地时间01:38)
当前代码中,tz2.localize()默认将01:38识别为冬令时(UTC+0),对应UTC时间01:38,和dt1的UTC 00:38不属于同一时间点。只需在localize时指定is_dst=True,强制将该时间识别为夏令时(UTC+1),即可让dt2对应UTC 00:38,与dt1相等。
修改后的dt2代码:
dt2 = tz2.localize(datetime(2020, 10, 25,1,38,43,454000), is_dst=True)
运行结果:
2020-10-25 00:38:43.454000+00:00 2020-10-25 01:38:43.454000+01:00 True
场景2:对应第二段代码(dt2初始为伦敦本地时间00:38)
当前代码中,tz2.localize()默认将00:38识别为夏令时(UTC+1),对应UTC时间2020-10-24 23:38,和dt1的UTC 00:38不属于同一时间点。只需在localize时指定is_dst=False,强制将该时间识别为冬令时(UTC+0),即可让dt2对应UTC 00:38,与dt1相等。
修改后的dt2代码:
dt2 = tz2.localize(datetime(2020, 10, 25,0,38,43,454000), is_dst=False)
运行结果:
2020-10-25 00:38:43.454000+00:00 2020-10-25 00:38:43.454000+00:00 True
补充说明
pytz的localize()方法在处理夏令时切换的歧义时间时,默认会采用夏令时规则(部分版本可能抛出错误),通过显式指定is_dst参数,可以明确告诉解释器该本地时间对应的时区规则,从而映射到唯一的UTC时间点,实现两个datetime对象的相等判断。
内容的提问来源于stack exchange,提问作者xzk
相关产品推荐
相关产品推荐

