Unix时间戳实际上跟踪了什么?

问题描述 投票:11回答:1

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

This wikipedia page包含所有闰秒的列表。第一个是

1972-06-30 23:59:60

关于Unix时间戳的陈述

至于“所有现代计算机系统”,Unix时间对于除秒之外的任何事情都是完全无知的。

资料来源:HackerNews, brazzy

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

资料来源:Hacker News, masklinn

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

可能的答案

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

A1:Unix时间戳跟踪自1970-01-01 00:00:00Z以来的SI秒。这意味着他们距离UTC只有27秒。

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

A3:Unix时间戳跟踪“以UTC为单位的秒数”。这意味着两个Unix时间戳1之间的差异在大多数情况下可能是1 SI秒,但不是全部。

请在答案中添加来源。

蟒蛇

蟒蛇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的支持。

python datetime unix-timestamp leap-second
1个回答
2
投票

A.4.16自大纪元以来的秒数

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

大多数系统的“时间”概念是持续增加的值,因此即使在闰秒期间该值也应该增加。但是,大多数系统不仅没有跟踪闰秒,而且大多数系统可能没有与任何标准时间参考同步。因此,要求自Epoch以来表示为秒的时间精确地表示参考时间与Epoch之间的秒数是不合适的。

足以要求允许应用程序处理此时间,就好像它表示引用时间和Epoch之间的秒数。系统供应商和系统管理员有责任确保此值表示引用时间与Epoch之间的秒数,以及在该系统上运行的应用程序所需的秒数。

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

© www.soinside.com 2019 - 2024. All rights reserved.