给朴素datetime添加tzinfo时出现异常时区偏移是什么原因?
问题原因
你遇到的异常偏移是pytz库的使用方式错误导致的:
- 绝大多数地理时区(比如
Europe/Kirov、America/Panama)在历史上有过时区偏移调整,直接调用datetime.replace(tzinfo=tz)赋值pytz的时区对象时,会默认使用该时区最早的本地平均时间(LMT)偏移,而非你传入日期对应的当前标准时区偏移,这就是你看到非整小时偏移的原因。 Etc/GMT-*这类属于固定偏移时区,没有历史偏移变化,所以直接replace的结果符合预期。
修复方案
方案1:继续使用pytz,替换replace为localize方法
pytz提供了专门的localize方法,会自动匹配传入日期对应的正确时区偏移:
from datetime import datetime import pytz def _converttime(dt_str, tz_str): dt = datetime.fromisoformat(dt_str) tz = pytz.timezone(tz_str) dt = tz.localize(dt) return dt
修改后测试得到的结果就是你预期的2018-01-01 00:00:00+03:00、2018-01-01 00:00:00-05:00。
方案2:Python 3.9+ 推荐使用标准库zoneinfo
Python 3.9开始官方提供了符合PEP495规范的时区实现zoneinfo,不需要额外安装pytz,直接使用replace即可得到正确结果:
from datetime import datetime from zoneinfo import ZoneInfo # Python 3.9+ 内置,更低版本可以安装第三方包backports.zoneinfo兼容 def _converttime(dt_str, tz_str): dt = datetime.fromisoformat(dt_str) tz = ZoneInfo(tz_str) dt = dt.replace(tzinfo=tz) return dt
内容的提问来源于stack exchange,提问作者Evgeny Mishkin
相关产品推荐
相关产品推荐

