使用pytz astimezone转换纽约至伦敦时间多出56分钟问题排查
问题分析与解决
核心问题
你遇到的56分钟误差,根源是直接给datetime.datetime构造函数的tzinfo参数赋值pytz时区对象。pytz的时区包含该时区的历史偏移记录(比如早期的本地平均时间LMT、夏令时变更),直接赋值时会使用该时区最早的偏移规则,而非当前的标准时区偏移。以纽约时区为例,其早期LMT偏移为UTC-4:56,而非我们熟悉的UTC-5/UTC-4,这就导致转换后的时间出现56分钟偏差。
而localize()报错,是因为该方法仅适用于无时区信息的naive datetime,你已经给NYTime设置了tzinfo,所以触发ValueError。
正确实现方式
先创建不带时区信息的naive datetime,再用pytz的localize()方法为其附加正确的时区,之后再通过astimezone()转换目标时区。
修正后的代码
import datetime import pytz import sys print(sys.version) # 创建无时区信息的naive datetime NYTime_naive = datetime.datetime(2023,3,28,6,0,0) # 用localize方法为其附加纽约时区 NYTime = pytz.timezone('America/New_York').localize(NYTime_naive) print("NYTime is " + NYTime.strftime("%Y%m%d-%H:%M:%S")) # 转换为伦敦时区 LondonTime = NYTime.astimezone(pytz.timezone('Europe/London')) print("LondonTime is " + LondonTime.strftime("%Y%m%d-%H:%M:%S"))
运行结果
3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] NYTime is 20230328-06:00:00 LondonTime is 20230328-11:00:00
额外说明
如果你的Python版本升级到3.9及以上,推荐使用标准库的zoneinfo模块,它的使用更直观,无需localize()操作:
from zoneinfo import ZoneInfo import datetime NYTime = datetime.datetime(2023,3,28,6,0,0, tzinfo=ZoneInfo('America/New_York')) LondonTime = NYTime.astimezone(ZoneInfo('Europe/London')) print(f"NYTime: {NYTime.strftime('%Y%m%d-%H:%M:%S')}") print(f"LondonTime: {LondonTime.strftime('%Y%m%d-%H:%M:%S')}")
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

