这里和其他地方都有很多关于闰秒的讨论,但这并不是一个复杂的问题,因为它与UTC、GMT、UT1、TAI或任何其他时间标准无关。 POSIX(Unix)时间按照IEEE Std 1003.1“POSIX”标准定义,
此处提供。
该标准是明确无误的:POSIX时间不包括闰秒。
协调世界时(UTC)包括闰秒。 但是,在POSIX时间(自纪元以来的秒数)中,忽略闰秒(未应用)以提供计算时间差的简便和兼容方法。 因此,POSIX时间可能并不是UTC,尽管外观相似。
该标准详细说明了POSIX时间不包括闰秒,特别是:
强制要求符合实现必须与任何特定官方时钟具有固定关系(考虑孤立系统或通过设置时钟到某个任意时间执行“重新运行”的系统)是一个实际上不可能的事情。
由于闰秒是由委员会决定的,因此在POSIX时间中包括闰秒不仅是一个“坏主意”,而且还不可能,因为该标准允许符合规范的实现没有网络访问权限。
在这个问题中,@Pacerier已经说过POSIX时间包括闰秒,并且每个POSIX时间可能对应多个UTC时间。虽然这确实是POSIX时间戳的一种可能解释,但这绝不是标准规定的。他的观点很大程度上只是空话,并不适用于定义POSIX时间的标准。
现在,事情变得复杂了。按照标准规定,POSIX时间可能与UTC时间不等价:
“因此,分解的POSIX时间并不一定是UTC时间,尽管它看起来是。”
然而,在实践中,它确实是。为了理解这个问题,你必须了解时间标准。GMT和UT1基于地球在宇宙中的天文位置。TAI基于宇宙中物理(原子)反应测量的实际时间流逝量。在TAI中,每秒都是一个“SI秒”,它们的长度完全相同。在UTC中,每秒也是一个SI秒,但根据需要添加闰秒,以将时钟重新调整到GMT / UT1的0.9秒以内。GMT和UT1时间标准是通过测量地球在宇宙中的位置和运动来定义的,这些经验性测量不能通过任何手段(科学理论或近似)预测。因此,闰秒也是不可预测的。
现在,POSIX标准还规定了一个意图,即所有不同实现中的POSIX时间戳应该是可互操作的(意味着相同)。一种解决方案是让每个POSIX秒等于一个SI秒,这样POSIX时间就等同于TAI(使用指定的纪元),除了原子钟以外,没有人需要联系任何人。然而,我们并没有这样做,可能是因为我们希望POSIX时间戳成为UTC时间戳。
利用POSIX标准中的一个明显漏洞,实现有意减慢或加快秒数--以便POSIX时间不再使用SI秒--以保持与UTC时间同步。阅读标准清楚地表明这不是预期的结果,因为这不能用于孤立系统,因此它们无法与其他机器互操作(它们的时间戳,没有闰秒,对于具有闰秒的其他机器来说意义不同)。
"漏洞"允许这种行为:
请注意,作为这种情况的实际后果,由某些外部标准测量的一秒钟长度未得到指定。
因此,实现机构通过有意将其更改为在隔离或非参与系统之间不能互操作的内容来滥用这种自由。或者,实现可能只是重复POSIX时间,就好像没有时间流逝一样。有关所有现代实现的详细信息,请参见
此Unix StackExchange答案。
哎呀,那真是令人困惑...真是个脑力挑战!