C标准(ISO / IEC 9899)规定:
7.2x.2.2
difftime
功能概要
#include <time.h> double difftime(time_t time1, time_t time0);
描述
difftime
函数计算两个日历时间之间的差异:time1 - time0
。返回
difftime
函数返回以秒为单位的差异double
。
如果结果占leap seconds或不符合,则会使其模糊不清(我猜是故意的)。差异(从1970年到2015年7月比较时为26秒)在某些应用中很重要。
C标准库的大多数实现都不考虑闰秒,这是可测试的:以下(故意简洁)代码往往输出leap seconds accounted for from 2000/01/01 to 2015/01/01: 0
(或-473385600
如果mktime
当那个时期确实有3个闰秒时,它是不起作用的。
#include <time.h>
#include <stdio.h>
struct tm t0,t1; // globals, thus initialized to zero
int main(void) {
t0.tm_year = 2000-1900; // from 2000
t1.tm_year = 2015-1900; // to 2015
t0.tm_mday = t1.tm_mday = 1; // first day of January
printf("leap seconds accounted for from 2000/01/01 to 2015/01/01: %.0f\n",
difftime( mktime(&t1), mktime(&t0) ) - 86400.*(365.*15+4) );
return 0;
}
是否存在具有C / C ++标准库的实际系统,这些系统考虑了闰秒,使用mktime
和difftime
的这种组合可以测试?
否则说:许多现代操作系统通过更新机制了解法律时间的立法变化,localtime
等标准库函数确实使用该信息并相应地计算其结果。就我所见,完全有可能,并且符合C标准,类似的更新机制会通知操作系统过去和将来的闰秒,以及difftime
或mktime
使用那些信息。我的问题是询问是否存在这样的系统和标准库,因为这会影响某些代码。
在comment之后:上下文是应该可以移植到各种系统的代码(从嵌入式到大型机,有些很旧),并决定何时(从调用时起的几秒钟内,作为整数大多数99999)必须触发一些动作,基于(自系统时间除外)给定的“数量”(非飞跃)“自2000/01/01以来在UTC午夜时间过去的秒数”以及所需的时间那个行动。可以容忍±2秒的误差(除了UTC参考的漂移之外)。
现有代码使用time
,mktime
为2000/01/01和difftime
之间的差异组合来区分它们,然后减去给定的。我想知道是否有严重的问题,它可能会失败(并返回一些稍微超出规定的容忍度的东西;就像4写作时太低,并且增加)。我不询问如何使代码可移植(一个选项是使用gmtime(time(NULL))
并使用显式代码计算其余部分)。
主要问题是在没有time
的情况下措辞,以便将time
帐户占用时区的不同可移植性问题排除在范围之外。
答案 0 :(得分:3)
这是一个信息问题,但它实际上是一个物理问题。
常见操作系统,了解UTC时间并最终了解本地时间。他们假设参考是UTC时间,并且所有分钟都持续60秒。它们使用闰秒来补偿其本地时间源(石英)和外部参考之间的误差。从他们的观点来看,滑动时钟的校正与真实(物理)闰秒之间没有区别。出于这个原因,他们不知道 true 闰秒,当前忽略它们
1955年,发明了铯原子钟。这提供了一种比天文观测更稳定,更方便的计时形式。
[1972年,TAI(Temps Atomique International in French)被定义,仅基于铯原子钟。]在20世纪70年代,由于引力时间,参与TAI的时钟变得明显不同。因此,扩张,并且组合的TAI标度对应于各种时钟的高度的平均值。从朱利安日期2443144。5(1977年1月1日00:00:00)开始,对所有参与时钟的输出进行校正,以便TAI对应于平均海平面(大地水准面)的适当时间。因为时钟平均远远高于海平面,这意味着TAI放缓了大约一万亿分之一。 由于潮汐减速,地球的转速非常缓慢地下降;这增加了平均太阳日的长度。 SI秒的长度是根据星历时间的第二个时间校准的,现在可以看出它与1750年至1892年间观测到的平均太阳日有关,由Simon Newcomb分析。因此,SI秒接近19世纪中期平均太阳日的1/86400。在早期的几个世纪中,平均太阳日短于86,400 SI秒,而在最近几个世纪,它超过86,400秒。接近20世纪末,平均太阳日的长度(也简称为#34;长度为#34;或者#34; LOD&#34;)约为86,400.0013 s。出于这个原因,UT现在变得更慢了#34;超过TAI的差异(或&#34;超额&#34; LOD)为1.3毫秒/天。
第一次闰秒发生在1972年6月30日。从那以后,平均每19个月发生一次闰秒,总是在6月30日或12月31日。截至2015年7月,总共有26个闰秒,全部为正,使UTC比TAI落后36秒。
TL / DR所以,如果你真的需要它,你必须得到(物理)UTC引入26闰秒的日期,并在相关时手动获取它们。 AFAIK,没有当前的操作系统,也没有标准库处理它们。
闰秒的介绍日期表保存为http://www.ietf.org/timezones/data/leap-seconds.list
的纯文本