问题描述
Unix 时间戳:
int(time.time())
给出自 1970 年 1 月 1 日以来经过的秒数,不含闰秒。
出于好奇,如何获得自此日期以来经过的真实秒数,包括闰秒? (即这两个事件在时间轴上的距离)
注意事项:
-
示例:时间戳范围
867715190.000 .. 867715202.000
表示 13 秒的“实际持续时间”(用计时器测量),因为 1997 年的这一天出现了闰秒,而 Unix 时间戳具有仅增加了 +12。 -
示例 2:从 1970 年 1 月 1 日到 2020 年 1 月 1 日(这 50 年间隔中的 12 个闰年)之间经过的实际时间是
(365*50+12)*24*3600 + number_leap_seconds
并且 不是(365*50+12)*24*3600
。但是我们看到datetime.datetime.utcfromtimestamp((365*50+12)*24*3600)
是2020-01-01 00:00:00
,所以显然没有考虑闰秒。 -
链接到 What does python return on the leap second 和 Unix time and leap seconds
解决方法
自 1972-01-01 以来任何两个 UTC 时间戳之间的 SI 秒数需要访问已引入 UTC 的闰秒列表。此列表作为 IANA tzdata 分发版的一部分提供,也可以从其他来源获得。
需要注意,因为 1970-01-01 和 1972-01-01 之间的 SI 秒数是 2x365x24x60x60 + 1.999918 SI 秒,因为 1970 年的官方时间不是由铯原子决定的,而是由实际测量决定的地球自转,所以官方的秒数是太阳秒,而不是 SI 秒。