为何Skyfield与datetime转换同一Unix时间戳的UTC时间差27秒?
为什么datetime和Skyfield转换Unix时间戳结果差27秒?
- 先搞清楚Unix时间戳的本质:它是从1970-01-01 UTC开始累计的SI标准秒数,完全不考虑闰秒——也就是说,UTC每插入一次闰秒,Unix时间戳不会跟着多算一秒,始终保持线性增长。
- Python的
datetime.utcfromtimestamp()就是直接把这个线性秒数映射成UTC时间,它的UTC模型里没有闰秒,所以得到的是2022-09-26 14:47:49。 - 你用Skyfield的方式错了!
load.timescale().utc(1970, 1, 1, 0, 0, 1664203669)这个调用里,最后一个参数是UTC时间体系下的秒数,这个体系是包含闰秒的。你把Unix时间戳(不含闰秒的数值)直接塞进去,相当于告诉Skyfield:“从1970年1月1日UTC零点开始,过1664203669个UTC秒(含闰秒)”,但因为到2022年9月为止UTC比Unix时间戳多了27个闰秒,所以最终得到的时间就会比实际早27秒。
正确的Skyfield用法应该用专门处理Unix时间戳的方法:
from skyfield.api import load ts = load.timescale() t = ts.from_unix_time(1664203669) print(t.utc_strftime())
运行后得到的结果会和datetime的输出一致:2022-09-26 14:47:49 UTC
补充说明:Skyfield的utc()方法是用来构造含闰秒的UTC时间的,比如要表示UTC的2016-12-31 23:59:60这个闰秒时刻,就可以用ts.utc(2016, 12, 31, 23, 59, 60),不能用Unix时间戳来套这个方法。
内容的提问来源于stack exchange,提问作者KDecker
相关产品推荐
相关产品推荐

