首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UNIX秒、TAI (SI)秒、跃秒和真实世界代码

UNIX秒、TAI (SI)秒、跃秒和真实世界代码
EN

Unix & Linux用户
提问于 2016-05-14 18:06:32
回答 3查看 1.7K关注 0票数 7

我最近读了很多关于UNIX时间的文章,其中大部分内容不连贯,很多内容相互矛盾。我正在尝试协调UNIX Time (此后,为了简单起见,UXT)、TAI和UTC之间的转换,为此,我需要正确地理解UXT。问题是,我似乎找不到其他人了。

以下是我最努力的解释,通过冗长的研究,从无数的来源重构而来.这在某些地方也是错误的。我正在寻找一个全面的分析和点对点验证/反驳以下内容。本质上,修复以下内容,使其工作。

  1. TAI是一个单调递增的时间标准。它标记SI秒,忽略DST和闰秒。
  2. UTC与TAI相同,但由一个整数的leap秒(对时间字符串的转换反映为60秒)进行校正,以便在距UT1 (天文时间标准)0.9SI秒的范围内。
  3. UXT是自1970-01-01 :00:00 UTC以来UNIX秒的计数。每天总有86400秒。然而,UXT与UTC有关。
  4. 这怎麽可能?好的,UNIX秒需要与SI秒不同,而且由于闰秒并不是完全规则的,所以UNIX秒不能是一个定义良好的时间长度。
  5. §4.15 UNIX规范别名中,从UTC到UXT的转换会将不同的UTC时间转换为相同的UXT时间戳,从而有效地使UNIX秒与SI秒相同(除了UNIX闰秒,即两个SI秒)。 在实践中,实际发生的事情各不相同。大多数计算机基于远程服务器进行同步,因此它们在同步期间隐式地处理闰秒更新。
  6. 所有这一切都意味着,虽然每个单独的UXT时间戳都可以很容易地转换为/从UTC (分别使用gmtime或§4.15 ),但您实际上不能通过算术来找到使用它们的任何东西。特别是difftime返回UNIX秒,所以您不能对它做任何事情,包括将它添加到不同的时间戳中,除非您知道所有相关的闰秒都在哪里。

我想到目前为止我能理解。

  1. 但是现在我们来看看实际的代码,它根本不做任何事情。我可以理解人们使用difftime测量持续时间,只是希望它足够好(或者不知道有问题),但是计时库也是错误的。 作为一个例子,libtai提供了从UXT:TAI := 4,611,686,018,427,387,914 + UXT到TAI的转换(tai_now.c:7)。因为TAI是SI秒,而UXT是UNIX秒,所以不能这样做。然而,由于libtai显式地处理跳跃秒,这似乎不合理,这是一个粗心大意的错误。,,这不是libtai特有的。你可以看到这类事情到处都是。

因此:第1-6点与第7点不一致,也就是说,大量的现有代码与它所代表的时间标准相矛盾。哪里出了问题?

EN

回答 3

Unix & Linux用户

发布于 2016-05-14 19:56:07

一个问题是,大多数文档都没有使用能够区分时间尺度而没有歧义句的词汇。我建议http://www.ucolick.org/~sla/leapsecs/picktwo.html作为对这个问题的介绍,在历史上有两种不相关的秒--一种是地球居民的日历日的细分,另一种是在特定的参照系中测量的固定的持续时间。任何时候,跨越1970年前后日期的图书馆都试图利用这两种类型的秒,最终提供的答案类似于声称提供arcsin(-2)的函数--也就是说,涉及到的复杂性需要仔细解释和定义被认为重要的东西。

票数 5
EN

Unix & Linux用户

发布于 2018-10-18 13:25:14

你说得对,这个烂摊子糟透了。我的结论是:

UXT和UTC是相同的,除了在闰秒。在那里,UTC数到60,UTX只是“挂起”一秒钟。

票数 0
EN

Unix & Linux用户

发布于 2023-04-03 14:36:10

对你的心理健康最好的是假设每天都有86,400秒,无一例外,这对大多数人来说已经足够了。如果你现在花时间,减去5,000乘以86,400秒,你就会得到同样的时间,分钟和秒,5000天前。

现在Posix时间是UTC,但随着闰秒的移除。这意味着它总是非常接近UT1 (太阳时间),最多0.9秒。最好的心理模型是,每次在UTC中添加或删除一个闰秒,在Posix中,我们将有一个2秒长的秒,或者一个0秒长的秒。你可以观察到,如果你恰好使用一个秒表,那么就会出现一个闰秒--根据Posix的说法,某一分钟会根据你的秒表需要61或59秒。或者,如果您的计算机显示一个秒的时钟,那么秒数就会静止一秒钟,或者在某个时间点跳转两秒。在确切的时刻之外,闰秒被移除,你不能观察到这一点。在Posix系统中没有跟踪这些更改。

这什么时候出了问题?根据Posix时间,如果有一场100米的比赛,就在正确的时间点,你记录开始和结束的时间,有人可以在他们开始后9.317秒完成比赛。实际上是10.317秒。因此,如果你有物理数据,那么时间间隔可能是错误的一秒。

你怎么能修好它?修正它的唯一方法是有一个表,说明何时插入闰秒,并使用这个表将“没有闰秒的UTC”更改为TAI。

请注意,Posix时间实际上并不是没有闰秒的UTC,但是您的系统提供了关于UTC是什么的最佳信息。您可以“手动”更改计算机上的时钟,Posix时间将被关闭。您的计算机上的时钟可能有点不准确,并由时间服务器纠正,在这种情况下,它将漂移可能每天离开世界协调时,然后纠正回来。

我有一个应用程序,这是一个问题,iOS (通常在Posix中)有一个sysctl调用,返回启动时间。该函数返回一个更改的日期,当您的时钟改变时,除了每秒一秒钟的更改外。它还会在重新启动计算机时返回更改的日期。因此,您可以存储最后一个已知值,并在启动时间更改时询问时间服务器。

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

https://unix.stackexchange.com/questions/283164

复制
相关文章

相似问题

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