Python datetime指定pytz tzinfo时US/Eastern时区偏移异常
异常根因
这是pytz库的经典误用问题,和运行设备无关:
pytz的时区对象存储了对应地区全历史周期的所有UTC偏移记录,不能直接作为tzinfo参数传入datetime构造函数。直接传参时,pytz不会根据传入的日期时间自动匹配对应时段的偏移规则,只会默认加载该时区最早的历史偏移值——US/Eastern对应的最早偏移是1883年美国标准化时区之前的纽约本地平太阳时偏移,数值恰好为-4小时56分,这就是输出异常偏移的核心原因。
正确编码方式
- 若继续使用pytz库,需先生成无时区信息的naive时间对象,再通过pytz时区实例的
localize()方法绑定时区,该方法会自动根据时间点匹配对应的冬/夏令时偏移:
import pytz from datetime import datetime tz = pytz.timezone("US/Eastern") # 先构造不带时区的原生时间 naive_dt = datetime(2021, 5, 5, 9, 30, 0) # 通过localize绑定时区,自动匹配正确偏移 dt = tz.localize(naive_dt) print(dt) # 输出结果:2021-05-05 09:30:00-04:00
注意:如果需要做跨时区转换,不要直接修改datetime的tzinfo属性,统一使用
astimezone()方法完成转换,避免偏移计算错误。
- 如果使用Python 3.9及以上版本,可直接使用标准库内置的
zoneinfo模块替代pytz,该模块不存在上述误用问题,支持直接将时区对象传入tzinfo参数构造时间:
from datetime import datetime from zoneinfo import ZoneInfo dt = datetime(2021, 5, 5, 9, 30, 0, tzinfo=ZoneInfo("US/Eastern")) print(dt) # 输出结果:2021-05-05 09:30:00-04:00
内容的提问来源于stack exchange,提问作者Serge Neff
相关产品推荐
相关产品推荐

