pytz库智利时区转换异常:夏令时调整日期变更导致问题
解决pytz未适配智利夏令时调整的问题
针对智利因选举调整夏令时生效日期(从9月第一个周六改为第二个周六)而pytz未适配的情况,给你几个可行的解决办法:
切换到zoneinfo(Python 3.9+ 推荐)
Python 3.9及以上自带的zoneinfo模块使用系统或最新的tzdata时区数据库,通常会更快适配这类政策变更。如果你的环境满足版本要求,直接替换pytz的使用方式:from zoneinfo import ZoneInfo from datetime import datetime santiago_time = datetime(2024, 9, 8, 12, 0, tzinfo=ZoneInfo("America/Santiago")) utc_time = santiago_time.astimezone(ZoneInfo("UTC"))若系统tzdata版本较旧,可单独安装更新版的
tzdata包:pip install --upgrade tzdata,zoneinfo会自动优先使用这个包的数据。手动更新pytz的时区数据
pytz本身的时区数据如果是旧版本,你可以手动替换它的时区文件。找到pytz安装目录下的zoneinfo/America/Santiago文件,替换为从IANA时区数据库最新版本获取的对应文件。不过这种方式比较繁琐,且更新后可能受后续pytz升级覆盖。自定义tzinfo规则临时适配
如果暂时无法切换模块或更新数据,可以自定义一个适配今年规则的Santiago时区类:from pytz import BaseTzInfo, utc from datetime import timedelta, datetime class CustomSantiagoTz(BaseTzInfo): def utcoffset(self, dt): # 2024年夏令时:9月第二个周六到4月第一个周日 dst_start = datetime(2024, 9, 14, 0, 0) # 第二个周六 dst_end = datetime(2025, 4, 6, 0, 0) # 次年4月第一个周日 if dst_start <= dt.replace(tzinfo=None) < dst_end: return timedelta(hours=-3) # 夏令时UTC-3 else: return timedelta(hours=-4) # 冬令时UTC-4 def dst(self, dt): dst_start = datetime(2024, 9, 14, 0, 0) dst_end = datetime(2025, 4, 6, 0, 0) if dst_start <= dt.replace(tzinfo=None) < dst_end: return timedelta(hours=1) return timedelta(0) def tzname(self, dt): if self.dst(dt): return "CLST" return "CLT" # 使用示例 santiago_tz = CustomSantiagoTz() local_time = datetime(2024, 9, 15, 10, 0, tzinfo=santiago_tz) utc_time = local_time.astimezone(utc)注意:这个自定义类只适配2024-2025年的规则,后续年份需要调整日期。
内容的提问来源于stack exchange,提问作者gilvictor
相关产品推荐
相关产品推荐

