4

我正在学习 Unix 高级编程中的练习,遇到了以下问题:

如果日历时间存储为带符号的 32 位整数,在哪一年会溢出?

正符号整数 = 2147483647

在以下计算中,我没有考虑闰年:

((((2147483647 / 60sec) /60min)/24)/365) = 68.1yrs

这是一种天真的方法。我怎样才能专业地解决这个问题?

堆栈成员之前提出的以下解决方案对于打印年份非常有帮助。

int epoch_time = INT_MAX;
struct tm * timeinfo;
time_t epoch_time_as_time_t = epoch_time;
timeinfo = localtime(&epoch_time_as_time_t);
printf("2] overflow date: %s", asctime(timeinfo));
4

3 回答 3

5

一种方法是使用 UNIXdate命令。具体来说,date -d '@<seconds>'将输出与<seconds>自 UNIX 纪元以来的秒数相对应的日期和时间。+%Y此外,如果您只关心年份,则可以提供格式说明符。

因此,对于此示例,您将执行

date -d '@2147483647' +%Y

并会看到输出2038

于 2017-01-26T06:10:37.713 回答
5

什么时候溢出

假设在有问题的平台上int是 32 位宽(并且time_t是一个整数类型,会说它不是一个struct例子),只是做

printf("%s\n", asctime(localtime(&(time_t){difftime(INT_MAX, 0)})));

而且你知道。

它打印:

Tue Jan 19 04:14:07 2038

将参数交换为difftime()一个可以得到“最早”的日期,顺便说一句:

printf("%s\n", asctime(localtime(&(time_t){difftime(0, INT_MAX)})));

印刷

Fri Dec 13 21:45:53 1901
于 2017-01-26T06:21:42.020 回答
3

这种方法可能看起来很幼稚,但几乎是准确的。您需要考虑闰年和闰秒。

UNIX 时间的维基百科页面在某处提到了 2038 年。在那里您可以找到其余的详细信息。

于 2017-01-26T06:20:38.973 回答