12

我知道 Unix 时间戳被定义为自1970-01-01 00:00:00Z. 但是,我找不到给出这个定义的明确来源。我还阅读了关于 UTC 和 Unix 时间戳之间关于闰秒的关系的各种不同的陈述。

此维基百科页面包含所有闰秒的列表。第一个是

1972-06-30 23:59:60

关于 Unix 时间戳的声明

至于“所有现代计算机系统”,Unix 时间除了秒之外,什么都不懂。

资料来源:HackerNews,brazzy

UNIX 时间跟踪 UTC 而不是 TAI,这意味着它“更正”了闰秒。结果,UNIX时间不是“自纪元以来的秒数”而是“86400 *(自纪元以来的整天数)+(自午夜以来的秒数)”,并且UNIX时间将向前(从未如此)和在闰秒后倒退(在大多数实现中,当一天从 23:59:60 到 00:00:00 时会重复一秒,因为它们具有相同的时间戳)。

资料来源:黑客新闻,masklinn

我也读过(但我再也找不到它了——在 Stack Overflow 上的某个地方)Unix Timestamps 假设每天正好有 24*60*60 秒。海报暗示日子仍然以某种方式保持同步,而闰秒只是“减慢”真正的秒。因此,“unix 时间戳秒”可能不是 SI 秒。

可能的答案

我可以看到三个可能的答案:

A1:Unix 时间戳跟踪自 1970-01-01 00:00:00Z 以来的 SI 秒。这意味着它们与 UTC 相差 27 秒。

A2:Unix 时间戳跟踪“在 TAI 中经过的秒数”。这意味着将 Unix 时间戳转换为 UTC 的库必须处理闰秒。

A3:Unix Timestamps 跟踪“在 UTC 中经过的秒数”。这意味着在大多数情况下,两个 Unix 时间戳之间的差异 1 可能是 1 SI 秒,但并非全部如此。

请为您的答案添加来源。

Python

蟒蛇datetime似乎不知道闰秒(?)。

>>> import datetime
>>> a = datetime.datetime(1972, 6, 30, 23, 59, 59)
>>> b = datetime.datetime(1972, 7, 1, 0, 0, 0)
>>> b-a
datetime.timedelta(0, 1)

并且该time模块似乎将实际的闰秒映射到前一秒:

>>> import time
>>> t3 = time.mktime((1972, 6, 30, 23, 59, 59, -1, -1, -1))
>>> t4 = time.mktime((1972, 7, 1, 0, 0, 0, -1, -1, -1))
>>> t4 - t3
1.0
>>> t4 = time.mktime((1972, 6, 30, 23, 59, 60, -1, -1, -1))
>>> t4 - t3
1.0

issue23574支持此印象。

4

2 回答 2

3

A.4.16 纪元以来的秒数

协调世界时 (UTC) 包括闰秒。但是,在 POSIX 时间(自纪元以来的秒数)中,闰秒被忽略(未应用)以提供一种简单且兼容的计算时间差的方法。因此,分解的 POSIX 时间不一定是 UTC,尽管它出现了。[...]

大多数系统的“时间”概念是一个不断增加的值,因此即使在闰秒期间该值也应该增加。然而,不仅大多数系统不跟踪闰秒,而且大多数系统可能不同步到任何标准时间参考。因此,要求从 Epoch 开始以秒表示的时间精确地表示参考时间与 Epoch 之间的秒数是不合适的。

要求允许应用程序将此时间视为表示参考时间和纪元之间的秒数就足够了。系统供应商和系统管理员有责任确保该值表示参考时间和 Epoch 之间的秒数,与在该系统上运行的应用程序所必需的一样接近。

来源: http: //pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap04.html#tag_21_04_16

于 2018-09-09T10:14:01.240 回答
0

Unix 时间跟踪自 1970-01-01 00:00:00 UTC 以来经过的 SI 秒减去 UTC 的闰。正闰秒不计算在内,负闰秒计算两次。换句话说,每天都持续了 86,400 SI 秒,因此 86,400 倍数的 Unix 时间对应于 UTC 午夜。

没有闰秒的午夜过渡(UTC 日持续 86,400 SI 秒):

UTC       Second #  Unix time (mod 86,400)
--------  --------  ----------------------
23:59:58  86,398th  86,398
23:59:59  86,399th  86,399
00:00:00  86,400th  86,400

正闰秒的午夜过渡(UTC 日持续 86,401 SI 秒);到目前为止已经发生了 27 天:

UTC       Second #  Unix time (mod 86,400)
--------  --------  ----------------------
23:59:59  86,399th  86,399
23:59:60  86,400th  86,399 <- positive leap second: not counted in Unix time
00:00:00  86,401th  86,400

负闰秒的午夜过渡(UTC 日持续 86,399 SI 秒);到目前为止从未发生过:

UTC       Second #  Unix time (mod 86,400)
--------  --------  ----------------------
23:59:57  86,397th  86,397
23:59:58  86,398th  86,398 86,399 <- negative leap second: counted twice in
00:00:00  86,399th  86,400           Unix time

有关其他信息,请参阅此答案

于 2021-06-01T01:57:37.403 回答