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,其他部分时区也存在该问题。
原因分析
- 时区数据源不同
- pytz自带完整的IANA(Olson)标准时区数据库,直接依据这套权威数据处理时区规则,能正确识别墨西哥城2023年起取消夏令时后的UTC-6固定偏移。
- dateutil的
tz.gettz在Windows平台默认调用系统自带的时区数据库,而非IANA数据。Windows的时区更新通常滞后于IANA标准,且对IANA时区名称的映射存在偏差——比如墨西哥城取消夏令时后,Windows系统未及时更新对应时区规则,导致tz.gettz仍沿用旧的夏令时逻辑返回UTC-05。
- 名称映射问题
Windows使用自有时区命名体系(如"Central Standard Time"),而非IANA的"America/Mexico_City"。tz.gettz直接传入IANA名称时,可能无法精准匹配系统内的时区条目,进而导致偏移计算错误。
解决方法
- 强制dateutil使用IANA数据:安装
tzdata包(dateutil 2.8.0+版本支持),让tz.gettz优先调用标准IANA数据库:
安装后重新运行代码,pip install tzdatatz.gettz("America/Mexico_City")就能返回正确的UTC-6偏移。 - 使用Windows原生时区名称:如果不想额外依赖包,可传入Windows自带的时区名称,比如墨西哥城对应"Central Standard Time":
注意:这种方式仅适用于Windows,跨平台会失效。print(now.astimezone(tz.gettz("Central Standard Time"))) - 统一使用标准时区库:追求跨平台一致性的话,建议统一用pytz,或Python 3.9+自带的
zoneinfo模块(Windows上需额外安装tzdata)。
内容的提问来源于stack exchange,提问作者Pankush Sharma
相关产品推荐
相关产品推荐

