Python时区处理异常:不同时区时间转换后Epoch值相同求助
问题技术解释
1. 原UTC时间转Epoch后对应UTC 19:55:45的原因
你在转换时没正确处理时区信息:
- 原字符串
'2022-12-28T20:55:45Z'是标准UTC时间(Z代表UTC时区)。 - 如果你用
datetime.strptime('2022-12-28T20:55:45Z', '%Y-%m-%dT%H:%M:%SZ')解析,得到的是无时区标记的naive datetime对象。 - 调用这个对象的
timestamp()方法时,Python会默认把它当成虚拟机本地时间(你的机器是Europe/Paris时区,12月执行CET时间,即UTC+1)。 - 所以Python会把这个被误认为是CET的20:55:45,转换为UTC时间19:55:45,对应的Epoch值就是1672257345——这就是你看到“时间晚1小时”的根源。
正确操作应该是解析时保留时区信息:比如用Python 3.7+的datetime.fromisoformat('2022-12-28T20:55:45Z')直接获取带UTC时区的datetime对象,或者给naive对象手动添加UTC时区后再转timestamp,这样得到的Epoch值会是1672260945,对应原UTC时间20:55:45。
2. 不同偏移量/时区转Epoch结果一致的原因
Epoch值是从1970-01-01T00:00:00 UTC到目标时间点的绝对秒数,它是时间线上的固定点,和时区无关:
- 只要不同时区的时间字符串指向的是同一个瞬间,转成的Epoch值就必然相同。比如
2022-12-28T20:55:45+1200和2022-12-28T08:55:45Z(UTC)是同一个时刻,它们的Epoch值完全一致。 - 你用pytz指定CET、Europe/Kiev等时区时,只是把同一个绝对时间点转换为对应时区的本地时间表示,再转Epoch时,本质还是计算同一个固定时间点到UTC纪元的秒数,结果自然不会变。
内容的提问来源于stack exchange,提问作者Egor
相关产品推荐
相关产品推荐

