首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Unix时间和闰秒

Unix时间和闰秒
EN

Stack Overflow用户
提问于 2013-05-14 09:22:01
回答 4查看 26.8K关注 0票数 57

关于Unix (POSIX)时间,维基百科说:

由于它对闰秒的处理,它既不是时间的线性表示,也不是UTC的真实表示。

但是Unix date命令似乎并没有真正意识到它们。

代码语言:javascript
运行
复制
$ date -d '@867715199' --utc
Mon Jun 30 23:59:59 UTC 1997
$ date -d '@867715200' --utc
Tue Jul  1 00:00:00 UTC 1997

Mon Jun 30 23:59:60 UTC 1997应该有一个闰秒。

这是否意味着只有date命令忽略了闰秒,而Unix的概念却没有呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-14 09:24:36

每天的秒数是固定的Unix时间戳

在Unix时代,Unix的时间数为零,并且从那个时代起每天增加86400。

所以它不能代表闰秒。操作系统将减慢时钟以适应这种情况。就Unix时间戳而言,闰秒根本不存在。

票数 42
EN

Stack Overflow用户

发布于 2013-05-14 09:36:33

Unix时间很容易使用,但有些时间戳不是真实时间,有些时间戳不是唯一的时间。

也就是说,有一些重复的时间戳表示时间上的两个不同的秒,因为在unix时间中,第60秒可能不得不重复自己(因为不可能有61个秒)。理论上,它们也可能是未来的差距,因为第60秒并不存在,尽管目前为止还没有跳过的闰秒。

unix time的基本原理:定义它是为了便于使用它。在标准库中添加对闰秒的支持是非常棘手的。例如,您希望在数据库中表示2050年1月1日。地球上没有人知道这个日子在世界协调时还有多少秒!日期不能作为UTC时间戳存储,因为IAU不知道我们在接下来的几十年中需要添加多少闰秒(它们和随机的一样好)。那么,当一个程序员在未来的任何两个日期之间的时间长度在一年或两年前才知道时,如何才能进行日期计算呢?Unix时间很简单:我们已经知道2050年1月1日的时间戳(即80年*一年中的秒数)。UTC全年都很难工作,而unix时间很难在瞬间完成。

不管它的价值是什么,我从来没有遇到过一个程序员,他同意闰秒。他们显然应该被废除。

票数 34
EN

Stack Overflow用户

发布于 2019-10-15 09:10:25

这里和其他地方有很多关于闰秒的讨论,但这不是一个复杂的问题,因为它与UTC、GMT、UT1、TAI或任何其他时间标准没有任何关系。根据定义,POSIX (Unix)时间是IEEE 1003.1 "POSIX“标准( 可在这里找到 )所指定的时间。

标准是明确的: POSIX时间不包括闰秒。

协调世界时(UTC)包括闰秒。然而,在POSIX时间(自时代以来的秒),闰秒被忽略(而不是应用),以提供一种简单和兼容的计算时间差的方法。因此,抛开POSIX时间不一定是UTC,尽管它的外观。

该标准非常详细,明确指出POSIX时间不包括闰秒,特别是:

实际上不可能要求一个符合的实现必须与任何特定的正式时钟有固定的关系(考虑孤立的系统,或者通过将时钟设置为任意时间来执行“重新运行”的系统)。

由于闰秒是由委员会决定的,因此在POSIX时间中包含闰秒不仅是一个“坏主意”,而且考虑到该标准允许不具有网络访问权限的一致性实现,这是不可能的。

在这个问题的其他地方@Pacerier说POSIX时间确实包括闰秒,每个POSIX时间可能对应于多个UTC时间。虽然这当然是对POSIX时间戳的一种可能的解释,但这绝不是标准所规定的。他的论点在很大程度上相当于不适用于定义POSIX时间的标准的含糊不清的词语。

现在事情变得复杂了。如标准所述,POSIX时间可能不等于世界协调时的时间:

因此,抛开POSIX时间不一定是UTC,尽管它的外观。

然而,在实践中却是如此。为了理解这个问题,你必须了解时间标准。格林尼治时间和UT1是基于地球在宇宙中的天文位置。TAI是根据物理(原子)反应测量的宇宙中经过的实际时间来确定的。在TAI中,每秒钟都是"SI秒“,它们都是完全相同的长度。在UTC中,每秒钟都是SI秒,但是为了将时钟重新调整到格林尼治时间/UT1的.9秒内,需要增加闰秒。格林尼治时间标准和UT1时间标准是由地球在宇宙中的位置和运动的经验测量定义的,这些经验测量不能通过任何手段(科学理论或近似)来预测。因此,闰秒也是不可预测的。

现在,POSIX标准还规定所有POSIX时间戳都可以在不同的实现中互操作(意味着相同的事情)。一种解决方案是,每个POSIX秒都是一个SI秒,在这种情况下,POSIX时间相当于TAI (具有指定的时间),除了原子钟以外,没有人需要与任何人联系。但是,我们没有这样做,可能是因为我们希望POSIX时间戳成为UTC时间戳。

使用POSIX标准中的一个明显漏洞,实现故意减慢或加快秒--因此POSIX时间不再使用SI秒--以便与UTC时间保持同步。阅读标准很明显,这并不是预期的,因为这不能用孤立的系统来完成,因此不能与其他机器进行互操作(它们的时间戳,没有闰秒,对其他机器来说意味着一些不同的东西,有闰秒)。阅读:

..。重要的是,自Epoch值以来对时间名称和秒的解释在各协调系统之间是一致的;也就是说,所有符合标准的系统都必须将“自时代以来的536457599秒”解释为1986年12月31日的59秒59分23小时,而不管系统对当前时间的概念是否准确。这个表达式是为了确保一致的解释,而不是试图指定日历。..。这个未指定的秒名义上等于国际系统(SI)秒的持续时间。

允许这种行为的“漏洞”:

注意,作为实际的结果,没有指定由外部标准测量的秒的长度。

因此,实现滥用这种自由,故意将其更改为定义上不能在孤立或不参与的系统之间互操作的东西。或者,实现可以简单地重复POSIX多次,就好像没有时间过去一样。有关所有现代实现的详细信息,请参阅这个Unix StackExchange答案

噢,这太让人困惑了。一个真正的大脑戏弄者!

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16539436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档