日历时间存储为带符号的32位整数 - 何时溢出

时间:2017-01-26 05:48:04

标签: c unix time-t year2038

我正在进行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));

3 个答案:

答案 0 :(得分:4)

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

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

date -d '@2147483647' +%Y

并会看到输出2038

答案 1 :(得分:4)

  

何时会溢出

假设有问题的平台int是32位宽(并且time_t整数类型,则会说它不是{{1}例如),只需做

struct

,你知道。

打印:

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

将参数交换为Tue Jan 19 04:14:07 2038 一个得到最早的&#34;&#34;可能的日期,BTW:

difftime()

打印

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

答案 2 :(得分:3)

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

UNIX上的维基百科页面提到了2038年的某个地方。在那里你可以找到其余的细节。