You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

给朴素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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:15:05