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

Windows系统中dateutil的tz.gettz时区偏移错误,pytz结果正确

为什么dateutil.tz.gettz在Windows上返回错误的时区偏移?

问题复现代码

from dateutil import tz
import datetime
import pytz

now = datetime.datetime.now(tz.UTC)
print(now.astimezone(tz.gettz("America/Mexico_City")))

# output -- 2023-05-16 09:59:43.668933-05:00

now = datetime.datetime.now(pytz.timezone("UTC"))
print(now.astimezone(pytz.timezone("America/Mexico_City")))

# output -- 2023-05-16 08:59:43.668933-06:00

在Windows系统中,上述两种方式得到的墨西哥城时区偏移存在差异:tz.gettz返回-05:00,而pytz返回正确的-06:00,其他部分时区也存在该问题。


原因分析

  1. 时区数据源不同
    • pytz自带完整的IANA(Olson)标准时区数据库,直接依据这套权威数据处理时区规则,能正确识别墨西哥城2023年起取消夏令时后的UTC-6固定偏移。
    • dateutil的tz.gettz在Windows平台默认调用系统自带的时区数据库,而非IANA数据。Windows的时区更新通常滞后于IANA标准,且对IANA时区名称的映射存在偏差——比如墨西哥城取消夏令时后,Windows系统未及时更新对应时区规则,导致tz.gettz仍沿用旧的夏令时逻辑返回UTC-05。
  2. 名称映射问题
    Windows使用自有时区命名体系(如"Central Standard Time"),而非IANA的"America/Mexico_City"。tz.gettz直接传入IANA名称时,可能无法精准匹配系统内的时区条目,进而导致偏移计算错误。

解决方法

  • 强制dateutil使用IANA数据:安装tzdata包(dateutil 2.8.0+版本支持),让tz.gettz优先调用标准IANA数据库:
    pip install tzdata
    
    安装后重新运行代码,tz.gettz("America/Mexico_City")就能返回正确的UTC-6偏移。
  • 使用Windows原生时区名称:如果不想额外依赖包,可传入Windows自带的时区名称,比如墨西哥城对应"Central Standard Time":
    print(now.astimezone(tz.gettz("Central Standard Time")))
    
    注意:这种方式仅适用于Windows,跨平台会失效。
  • 统一使用标准时区库:追求跨平台一致性的话,建议统一用pytz,或Python 3.9+自带的zoneinfo模块(Windows上需额外安装tzdata)。

内容的提问来源于stack exchange,提问作者Pankush Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:05:21