使用pytz与ZoneInfo处理时区结果不一致,问题出在哪?
pytz添加时区出现错误偏移的原因及解决方法
你遇到的问题是因为pytz的时区对象包含历史时区数据,直接用datetime.replace(tzinfo=...)会绑定该时区的最早历史偏移(迪拜早期确实使用过+03:41的偏移),而非当前生效的标准偏移。
正确的pytz用法
pytz要求使用localize()方法为无时区的datetime对象附加时区,该方法会根据传入的日期自动匹配对应时区在该时间点的正确偏移:
from datetime import datetime import pytz from zoneinfo import ZoneInfo cur = datetime.now(tz=None) print("utc,", cur) # -> 2023-02-24 17:28:20.574694 # 使用pytz的localize方法(正确写法) cur_tz = pytz.timezone('Asia/Dubai').localize(cur) print("dubai with pytz (fixed),", cur_tz) # -> 2023-02-24 17:28:20.574694+04:00 cur_tz = cur.replace(tzinfo=ZoneInfo('Asia/Dubai')) print("dubai with zoneinfo,", cur_tz) # -> 2023-02-24 17:28:20.574694+04:00
两者差异的核心原因
- pytz的时区对象设计为兼容历史时区变更,
replace方法无法感知当前datetime的日期,只能返回时区对象默认的最早偏移值。 - zoneinfo是Python 3.9+的标准库,默认使用时区的当前标准偏移,因此直接用
replace即可得到正确结果。
内容的提问来源于stack exchange,提问作者Aizaz
相关产品推荐
相关产品推荐

