Python时区转换后strftime('%s')生成的epoch为何不一致?
时区转换后strftime('%s')生成Epoch时间不一致的原因及解决方法
问题场景
用户处于US/Pacific时区(设备时区一致),执行以下Python代码:
import time import pytz from datetime import datetime from datetime import timezone from zoneinfo import ZoneInfo tz_pac = pytz.timezone('US/Pacific') dt_pac = tz_pac.localize(datetime(2024, 2, 25)) print(dt_pac) # 输出:datetime.datetime(2024, 2, 25, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>) epoch_pac = int(dt_pac.strftime('%s')) print(epoch_pac) # 输出:1708848000(结果正确)
接着将时间转换到US/Eastern时区:
tz_est = pytz.timezone('US/Eastern') dt_est = tz_est.normalize(dt_pac) print(dt_est) # 输出:datetime.datetime(2024, 2, 25, 3, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)(逻辑正确,太平洋午夜对应东部凌晨3点)
但执行print(int(dt_est.strftime('%s')))得到1708858800,该值实际为太平洋时区凌晨3点的Epoch时间,而非东部时区对应时间,疑问:为何两次生成的Epoch不一致?
核心原因
strftime('%s')的实现不识别datetime对象自身携带的时区信息,它只会提取对象的“年/月/日/时/分/秒”数值,结合当前设备的本地时区来计算Epoch时间。
你的设备时区是US/Pacific,当处理dt_est时:
dt_est的数值是2024-02-25 03:00,时区标记为US/Eastern- 但
strftime('%s')会忽略这个时区标记,直接把2024-02-25 03:00当成US/Pacific时区的时间转换,最终得到太平洋时区凌晨3点的时间戳1708858800,而非东部时区3点对应的正确Epoch(和dt_pac的1708848000一致,因为二者是同一时刻)。
正确解决方法
不要使用strftime('%s'),改用datetime对象的timestamp()方法,它会基于对象自身的时区信息计算对应的Epoch时间:
# 对dt_pac计算Epoch print(int(dt_pac.timestamp())) # 输出:1708848000(正确) # 对dt_est计算Epoch print(int(dt_est.timestamp())) # 输出:1708848000(和dt_pac一致,符合同一时刻的Epoch定义)
timestamp()方法会正确识别datetime对象的时区,先将其转换为UTC时间,再计算从1970-01-01 UTC开始的秒数,完全符合Epoch时间的标准定义。
内容的提问来源于stack exchange,提问作者lolo
相关产品推荐
相关产品推荐

