我正在进行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));
答案 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年的某个地方。在那里你可以找到其余的细节。