Python使用pytz处理时区时出现1分钟偏移异常问题咨询
问题根因
- 这是
pytz库的经典使用错误,不能直接用datetime.replace(tzinfo=xxx)的方式给datetime对象绑定pytz提供的时区对象。 - 原因是pytz的时区对象存储了对应区域所有历史时期的UTC偏移规则,不是单一固定偏移值。以你用到的Europe/London时区为例,1847年之前伦敦使用的当地平均时间和GMT(UTC前身)确实存在-1分15秒左右的偏移,pytz保留了这个历史偏移数据。
- 当你直接调用
replace(tzinfo=tz)时,pytz无法自动匹配你传入的datetime对应的正确偏移规则,默认会返回最早的历史偏移值,就是你看到的-00:01的结果,后续做astimezone转换的时候就会出现异常的1分钟时间差。
正确实现方式
两种正确的时区绑定写法:
- 用pytz提供的
localize方法绑定无时区信息的datetime对象
from pytz import timezone import datetime utc = datetime.timezone.utc tz = timezone("Europe/London") # 先拿到无时区的UTC时间 now_naive = datetime.datetime.utcnow() # 用localize绑定时区,pytz会自动匹配对应时间的正确偏移 date = tz.localize(now_naive) date_utc = date.astimezone(utc)
- 直接在获取当前时间的时候指定时区,一步到位
from pytz import timezone import datetime tz = timezone("Europe/London") now = datetime.datetime.now(tz) date_utc = now.astimezone(datetime.timezone.utc)
补充说明
Python 3.9+官方标准库已经新增了zoneinfo模块作为时区实现,不需要再安装第三方pytz库,也不存在这个replace的坑,用法更简单:
from zoneinfo import ZoneInfo import datetime tz = ZoneInfo("Europe/London") now = datetime.datetime.now(tz) # 直接用replace也不会出现历史偏移问题 now_replace = datetime.datetime.now(datetime.timezone.utc).replace(tzinfo=tz)
内容的提问来源于stack exchange,提问作者marke
相关产品推荐
相关产品推荐

