Unix时间/官方时间在哪里测量?[关闭]


20

免责事项:

我只是浏览了StackExchange网站列表约20分钟,试图弄清楚将其发布在何处。如果您知道任何更合适的网站,请在此提出问题。我将其发布在这里是因为Unix时间让我思考。


因此,众所周知,有unix时间,也有UTC。Unix时间一直在滴答滴答地计时,以秒为单位(每秒一秒),而UTC则尝试将时间保持在人类可读取的格式中,以与地球自转的相位保持一致。为此,UTC会不时插入leap秒。

由于时间是与重力有关的,因此经历时间的物体会受到其他加速度和相对速度的影响,因此这就引出了两个问题。让我们先简单一点:Unix时间在哪里测量?如果爱丽丝和鲍勃开始同意在同一地点的当前时间是1467932496.42732894722748(当然,一秒定义为9'192'631'770辐射周期,对应于铯133的两个能级之间的转换)原子在静止和0 K时),由于爱丽丝生活在海平面上而鲍勃生活在高山上,或者爱丽丝生活在北极,而鲍勃生活在赤道上,则经历了一个孪生悖论,他们不再同意了。那么,Unix时间如何精确定义?

您最初可能不会看到UTC的问题,因为肯定每个人都可以就地球何时完成轨道达成共识(这当然忽略了大陆板块的运动,但是我认为我们已经很好地弄清楚了这一点,因为使用GPS可以测量其运动非常精确,我们可以假设它们在模型中处于固定位置,并且不会随着大陆板块的移动而移动),无论它们是在高山上,在海平面上,在赤道上还是在北极上。可能会有一些时差,但不会累积。

但是第二秒被定义为9'192'631'770的辐射周期,对应于静止和0 K时铯133原子的两个能级之间的跃迁,而铯133原子并不关心地球的轨道。所以UTC决定在哪里插入一个闰秒,但是,必须有地球轨道的相位和测得的时刻之间的测量或预测移位某处由原子钟。那是哪里


5
“ Unix时间一直在计时,每秒数秒-每秒一秒”-实际上,事实并非如此。如果这样做的话,事情会更简单。
霍布斯

3
我认为您想提出的问题本来是关于物理的主题-但这是关于时间标准(例如UTC)的问题,与UNIX时间无关。另请参阅以及其他相关问题。
David Z

7
我投票结束这个题为离题,因为它是关于物理,政治和时间标准的,而不是Unix。
Michael Homer

3
可能在这方面,你可以问一个切合主题的问题的地方,但我不认为这是它。它只有“ ...以及Unix怎么样?” 如答案所示,偶尔会碰到一个不相关的问题。
Michael Homer

Answers:


30

您的标题问题没有真正的答案;Unix时间不是真实的时间尺度,也不是在任何地方“测量”的时间。它是UTC的一种表示形式,尽管它很差,因为UTC中的某些时刻无法表示。Unix时间坚持每天有86,400秒,但是由于leap秒,UTC偏离了该时间。

关于更广泛的问题,有四个重要的时间表:

  1. UT1(通用时间),由世界各地的天文台计算得出,这些天文台测量地球相对于固定恒星的自转。通过这些观察和一点数学运算,我们得到了格林威治标准时间的更现代版本,该时间基于格林威治皇家天文台太阳正午的时刻。世界时间是由称为IERS(国际地球自转和参考系统服务,以前称为国际地球自转服务)的组织计算的。

  2. TAI(国际原子时间)由世界各地数百个原子钟保存,并由国家标准机构等维护。促成TAI的时钟保持者使用时间转移技术来使它们的时钟彼此相对,从而消除单个时钟的任何细微误差并创建整体时间;该合奏是TAI,由国际度量衡局(BIPM)发布,是SI单位制的管理者。为了回答有关时间膨胀的问题,TAI被定义为海平面上的原子时间(实际上是在大地水准面,这是同一个想法的更高级版本),并且每个时钟都会校正其自身高度的影响。

  3. UTC(世界标准时间)。1972年1月1日,UTC设置为比TAI落后十秒钟,并且自该日期以来,滴答声的前进速度与TAI完全相同,除非加上或减去a秒。IERS决定宣布一个a秒,以将差异保持在0.9秒内(实际上,在大约0.6秒内;增加的leap秒将导致差异从-0.6变为+0.4)。从理论上讲,leap秒既可以是正值,也可以是负值,但是由于地球的自转速度比SI和TAI制定的标准要慢,因此负a秒从来没有必要,而且可能永远不会。

  4. Unix时间,它最大程度地将UTC表示为一个数字。每个Unix时间是86,400的倍数,对应于午夜UTC。由于并非所有UTC天都长86,400秒,但所有“ Unix天”都长,因此存在某种不可弥补的差异,必须以某种方式加以弥补。没有Unix时间对应于增加的leap秒。在实践中,系统要么表现为前一秒发生两次(unix时间戳向后跳一秒,然后再次向前前进),要么应用诸如leap游涂抹的技术使时间的扭曲在更长的时间内leap秒。在这两种情况下都存在一些误差,尽管至少第二种是单调的。在这两种情况下b不等于BA; 它等于ba 加上中间的leap秒数

由于UT1,TAI,UTC和IERS都是在全球范围内开展的跨国工作,因此,尽管IERS公告是从巴黎天文台发布的,而且BIPM也位于巴黎,但没有一个“哪里”。需要精确的,可追溯的时间的组织可能会将其时基声明为“ UTC(USNO)”之类的内容,这意味着其时间戳记为UTC,并且它们是根据美国海军天文台的时间得出的,但存在以下问题:我在Unix时间中提到,它基本上与该精度水平不兼容-处理真正精确时间的任何人都可以替代Unix时间。


1
您忽略了right/Olson系统中时区的存在以及它们如何看待time_t
JdeBP '16

1
@JdeBP我实际上还没有听说过。我认为在Unix时间明显违反POSIX和长期惯例的情况下称Unix时间有点可疑,但是无论如何它都是有价值的信息。也许您可以添加一个答案?
hobbs

1
对于普通人来说,获取高精度时间源的最简单方法是GPS接收器。卫星上的时钟与TAI同步,并且信号的精确度约为10 s(不进行校正;经过校正,可以提高到10 s 1)。
Jan Hudec

1
@JanHudec并非普通人能分辨出精确到10平方英寸或10平方英寸的时钟之间的差异。
Gerrit '16

1
仅说明为什么UNIX不包含leap秒支持。奥斯汀集团电话会议对此进行了多次讨论,其结果是增加对leap秒的支持会比忽略支持造成更多的问题。
2016年

12

时钟的调整由IERS协调。他们根据需要安排在时间流中插入stream秒。

NTP时标和飞跃秒

巴黎天文台的国际地球自转服务(IERS)使用USNO和其他天文台提供的天文观测来确定针对地球自转的不规则变化而校正的UT1(导航仪)时标。

据我所知,第二天的23:59:60(Le秒)和第二天的00:00:00在Unix时间中被视为同一秒。


8

UNIX时间是在运行UNIX的计算机上测量的。

这个答案将期望您知道什么是协调世界时(UTC),国际原子时(TAI)和SI秒。对它们的解释远远超出了Unix和Linux Stack Exchange的范围。 这不是物理或天文学堆栈交换。

硬体

您的计算机包含用于驱动时钟和计时器的各种振荡器。确切的说,它的结构因计算机而异。但是通常,并且非常笼统地说:

  • 有一个可编程的间隔计时器某个地方(PIT),可以对其进行编程以计算给定的振荡次数,并向中央处理单元触发中断。
  • 中央处理器上有一个周期计数器,对于执行的每个指令周期,该计数器仅计数1。

广义上的操作理论

操作系统内核利用PIT来生成滴答声。它将PIT设置为自由运行,在例如百分之一秒的时间间隔内计算正确的振荡次数,生成中断,然后自动将计数重置为再次运行。对此有一些变化,但是从本质上讲,这会导致滴答中断以固定的频率引发。

在软件中,内核每隔一个滴答就增加一个计数器。它知道节拍频率,因为它首先对PIT进行了编程。因此,它知道每秒有多少滴答声。它可以使用它来知道何时增加一个计数秒的计数器。后者是内核的“ UNIX Time”思想。实际上,如果将其留给自己的设备,它确实会以每SI秒一个的速率向上计数。

有四件事使这变得复杂,我将以非常笼统的术语来介绍。

硬件并不完美。一个PIT,其数据表中说它的振荡器频率为N Hertz ,它的频率可能为(例如)N .00002 Hertz,具有明显的后果。

该方案与电源管理的互操作性非常差,因为CPU每秒醒来数百次,要做的只是增加变量中的数字。因此,某些操作系统具有所谓的“不滴答”设计。内核不(让PIT为每个滴答发送中断),而是(从低级调度程序中)计算出要执行多少滴答,而没有线程量子用完,然后对PIT进行编程以将这么多滴答计数到线程中。发出滴答中断之前的未来。它知道然后必须记录N的通过在下一个滴答中断中滴答,而不是1个滴答。

应用程序软件可以更改内核的当前时间。它可以步进值或压摆值。回转涉及到调整秒数以增加秒计数器。因此,无论如何,秒计数器不一定以秒为单位,即使假设完美的振荡器。步进涉及简单地在秒计数器中写入一个新数字,这通常要等到最后一秒被滴答后的1 SI秒才会发生。

现代内核不仅数秒,而且数秒。但是,每纳秒一次的滴答中断很荒谬,而且通常是完全不可行的。这就是诸如周期计数器之类的东西发挥作用的地方。内核会记住每秒(或每个刻度)的周期计数器值,并可以从当前值算出在某些人想知道时间(以纳秒为单位)时计数器值算出,自最后一秒(或蜱)。但是,由于指令周期频率可以改变,因此电源和热量管理也遭受了严重破坏,因此内核执行诸如依赖诸如高精度事件计时器(HPET)之类的附加硬件的事情。

C语言和POSIX

C语言的标准库描述了不透明的类型,方面时time_t,结构类型tm与各种指定字段,和不同的库函数等time()mktime()localtime()

简而言之:C语言本身仅保证它time_t是可用的数字数据类型之一,并且计算时间差的唯一可靠方法是difftime()函数。POSIX标准实际上提供了更严格的保证,它time_t整数类型之一,并且自从Epoch开始计数秒数。也是指定timespec结构类型的POSIX标准。

time()功能有时被称为系统调用。实际上,如今,很长一段时间以来,它并不是许多系统上的底层系统调用。例如,在FreeBSD上,基础系统调用为clock_gettime(),它具有各种可用的“时钟”,以各种方式以秒或秒+纳秒为单位进行测量。应用程序软件通过该系统调用从内核读取UNIX Time。(匹配的clock_settime()系统调用使他们可以踩踏,而adjtime()系统调用则允许他们将其压摆。)

许多人对POSIX标准提出了非常明确和确切的要求。这样的人常常不实际阅读 POSIX标准。按照其原理,计数“自纪元以来的秒数”(即标准使用的短语)的想法有意未指定POSIX秒与SI秒的长度相同,也未指定POSIX秒的长度为gmtime()“ UTC,尽管出现了”。POSIX标准是故意的足够松散,因此它允许(例如)管理员使用的UNIX系统,并通过在发生后一周重新设置时钟来手动修正leap秒调整。的确,原理表明,它有意放松得足以容纳故意将时钟设置为不同于当前UTC时间的某个时间的系统。

UTC和TAI

从内核获得的UNIX时间解释取决于应用程序中运行的库例程。POSIX在内核的时间和中的“中断时间”之间指定一个标识struct tm。但是,正如丹尼尔·J·伯恩斯坦(Daniel J. “在违约中比在遵守方面更值得荣誉”是一个容易想到的短语。

确实是这样。如今,有几种系统基于由亚瑟·戴维·奥尔森(Arthur David Olson)编写的库例程进行解释,该例程参考了臭名昭著的“奥尔森时区数据库”,通常将其编码为/usr/share/zoneinfo/。Olson系统具有两种模式:

  • 内核的“自纪元以来的秒数”被认为是自1970-01-01 00:00:00 UTC以来的UTC秒,leap秒除外。这将使用posix/Olson时区数据库文件集。整天都有86400内核秒,而一分钟永远不会有61秒,但是它们并不总是SI的长度,发生when秒时内核时钟需要回转或步进。
  • 内核的“自纪元以来的秒数”被视为计算自1970-01-01 00:00:10 TAI以来的TAI秒。这将使用right/Olson时区数据库文件集。内核秒数为1 SI秒长,内核时钟无需调整或步进即可调整leap秒,但细分时间可以具有23:59:60之类的值,而天数不一定总是86400内核秒数。

M. Bernstein编写了包括他的daemontools工具集在内的一些工具,这是必需的,right/因为time_t自1970-01-01 00:00:00 TAI以来,他们只增加了10 来获得TAI秒。他在手册页中对此进行了记录。

(也许在不知不觉中)此要求由诸如daemontools-encorerunit和Felix von Leitner's的工具集继承libowfat。使用伯恩斯坦multilog冈特multilog,或佩普svlogd与奥尔森posix/结构中,例如,所有的TAI64N时间戳将(在写这篇的时间)的后面26秒实际 TAI因为1970-01-01 00:00:10第二计数TAI。

我和Laurent Bercot在s6和nosh中解决了这个问题,尽管我们采取了不同的方法。M. Bercot tai_from_sysclock()依赖于编译时标志。使用TAI64N处理的nosh工具会查看TZTZDIR环境变量以进行自动检测posix/right/如果可以的话。

有趣的是,FreeBSD文档time2posix()posix2time()函数允许使用相当于TAI秒的Olson right/模式time_t。但是,显然没有启用它们。

再来一次…

UNIX时间是通过计算机硬件中包含的振荡器在运行UNIX的计算机上测量的。它不使用SI秒;即使从表面上看,它也不是UTC。并且故意使您的时钟出错。

进一步阅读

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.