使用pytz进行UTC与America/Winnipeg时区转换出现偏差问题求助
pytz时区转换问题:America/Winnipeg与UTC双向转换出现偏差
问题场景
在Django中使用pytz库进行UTC和America/Winnipeg时区转换时,正向转换(UTC→Winnipeg)结果正常,但反向转换(Winnipeg→UTC)出现明显偏差,怀疑是库的bug。
测试代码
import datetime import pytz # UTC转"America/Winnipeg" utc1 = datetime.datetime(2025,4,8,12,00) utc1 = utc1.replace(tzinfo = pytz.utc) utc2wpg = utc1.astimezone(pytz.timezone("America/Winnipeg")) wpgb2utc = utc2wpg.astimezone(pytz.utc) print(f"UTC Time: {utc1}") print(f"UTC to Winnipeg Time: {utc2wpg}") print(f"Winnipeg back to UTC Time: {wpgb2utc}") # America/Winnipeg转UTC wpg1 = datetime.datetime(2025,4,8,7,0) wpg1 = wpg1.replace(tzinfo = pytz.timezone("America/Winnipeg")) wpg2utc = wpg1.astimezone(pytz.utc) utcb2wpg = wpg2utc.astimezone(pytz.timezone("America/Winnipeg")) print(f"Winnipeg Time: {wpg1}") print(f"Winnipeg to UTC Time: {wpg2utc}") print(f"UTC back to Winnipeg Time: {utcb2wpg}")
运行结果
正向转换(UTC→Winnipeg)输出正常:
UTC Time: 2025-04-08 12:00:00+00:00 UTC to Winnipeg Time: 2025-04-08 07:00:00-05:00 Winnipeg back to UTC Time: 2025-04-08 12:00:00+00:00
反向转换(Winnipeg→UTC)输出异常:
Winnipeg Time: 2025-04-08 07:00:00-06:29 Winnipeg to UTC Time: 2025-04-08 13:29:00+00:00 UTC back to Winnipeg Time: 2025-04-08 08:29:00-05:00
问题原因与解决方法
这是代码使用错误,不是pytz的bug。
问题出在replace(tzinfo=pytz.timezone("America/Winnipeg"))这行:对于非UTC的时区,replace()方法不会应用该时区的夏令时规则或历史偏移修正,而是直接使用时区的原始偏移值(这里的-06:29是Winnipeg在1880年代使用的偏移,并非2025年的有效偏移)。
正确的做法是使用pytz时区对象的localize()方法来为datetime对象设置时区,该方法会自动处理时区的偏移规则:
# 修正后的反向转换代码 wpg1 = datetime.datetime(2025,4,8,7,0) wpg_tz = pytz.timezone("America/Winnipeg") wpg1 = wpg_tz.localize(wpg1, is_dst=None) # is_dst=None会自动检测夏令时,避免歧义 wpg2utc = wpg1.astimezone(pytz.utc) utcb2wpg = wpg2utc.astimezone(wpg_tz)
修正后运行,反向转换的输出会与正向转换一致:
Winnipeg Time: 2025-04-08 07:00:00-05:00 Winnipeg to UTC Time: 2025-04-08 12:00:00+00:00 UTC back to Winnipeg Time: 2025-04-08 07:00:00-05:00
注:测试环境为Python 3.13,会得到相同的异常输出,修正后恢复正常。
内容的提问来源于stack exchange,提问作者Tireni Kuti
相关产品推荐
相关产品推荐

