【发布时间】:2015-07-09 09:16:45
【问题描述】:
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 年 1 月 1 日午夜 UTC 以来经过的秒数”和所需的动作时间. ±2 秒的误差(除了 UTC 参考的漂移)是可以容忍的。
现有代码使用time、mktime 表示 2000/01/01 和 difftime 的简单组合来表示它们之间的差异,然后减去给定的值。我想知道是否有严重的担心它可能会失败(并且返回的东西稍微超出了规定的公差;比如在写作时 4 太低了,而且还在增加)。我不询问如何使代码可移植(一种选择是使用gmtime(time(NULL)) 并使用显式代码计算其余部分)。
主要问题的措辞是不带time,以排除time是否考虑时区的不同可移植性问题。
【问题讨论】:
-
“差异很大” - 26 秒与 45 年真的微不足道。
-
这是一个有趣的问题,但是要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack 来说是题外话溢出,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,describe the problem 以及迄今为止为解决它所做的工作。
-
@KarolyHorvath:这本质上是在争论
double是不需要的,因为float具有足够的精度。 -
@Marian:C 标准没有提到 1970 年。我曾使用 C 标准库,其中参考是 1904(MacOS Classic)。 C 标准也没有说明 difftime 的输入是以秒为单位的,以及这些是多少秒(过去 10 天,有 864001 秒,其中一个是闰);我猜想一些 C 标准库使用的单位小于第二个,C 标准肯定允许这样做。
-
@Eregrith:如果您的印象是我要求推荐一个考虑闰秒的系统,那么现在应该清楚的是,情况并非如此;而是我害怕遇到这样的系统。
标签: c++ c portability standard-library