Python中datetime.utcfromtimestamp时间偏移问题:仅改指定行修复
问题
我有一个表示UTC时间的字符串ts,希望将其转换为整数时间戳后,使用datetime.utcfromtimestamp恢复为原时间。现有代码如下:
ts = '2023-07-10 14:06:22.000 UTC' int_ts = int(datetime.strptime(ts, "%Y-%m-%d %H:%M:%S.%f %Z").timestamp() * 1000) # 仅可修改此行 back_to_ts = datetime.utcfromtimestamp(int_ts / 1000) print(f"{back_to_ts = }, {ts = }, {int_ts = }")
当前输出为:
back_to_ts = datetime.datetime(2023, 7, 10, 12, 6, 22), ts = '2023-07-10 14:06:22.000 UTC', int_ts = 1688990782000
期望输出为:
back_to_ts = datetime.datetime(2023, 7, 10, 14, 6, 22), ts = '2023-07-10 14:06:22.000 UTC', int_ts = 1688990782000
仅允许修改第二行代码,应如何调整以实现期望输出?
解决方案
问题根源在于:datetime.strptime解析带%Z的UTC字符串时,生成的是未标记时区的naive datetime对象,调用timestamp()方法时会将其当作本地时区时间处理,导致时间戳计算出现偏移。
修改第二行代码,为解析后的datetime对象显式添加UTC时区标记,再计算时间戳:
int_ts = int(datetime.strptime(ts, "%Y-%m-%d %H:%M:%S.%f %Z").replace(tzinfo=datetime.timezone.utc).timestamp() * 1000)
关键说明
replace(tzinfo=datetime.timezone.utc):将naive datetime转换为带UTC时区标记的aware datetime,确保后续时间戳计算基于UTC标准。- 此时生成的时间戳能准确对应原UTC字符串的时间,用
datetime.utcfromtimestamp恢复时,就能得到与原字符串一致的UTC时间。
修改后运行代码,输出将完全符合期望:
back_to_ts = datetime.datetime(2023, 7, 10, 14, 6, 22), ts = '2023-07-10 14:06:22.000 UTC', int_ts = 1688990782000
内容的提问来源于stack exchange,提问作者David Masip
相关产品推荐
相关产品推荐

