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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:07:22