日历时间存储为带符号的 32 位整数 - 何时溢出
calendar time stored as a signed 32-bit integer - when will it overflow
我正在做 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));
一种方法是使用 UNIX date
命令。具体来说,date -d '@<seconds>'
将输出自 UNIX 纪元以来 <seconds>
秒对应的日期和时间。此外,如果您只关心年份,可以提供格式说明符 +%Y
。
因此,对于此示例,您将执行
date -d '@2147483647' +%Y
并会看到输出 2038
。
该方法可能看起来很幼稚,但几乎是准确的。您需要考虑闰年和闰秒。
关于 UNIX 时间的维基百科页面在某处提到了 2038 年。在那里您可以找到其余的详细信息。
when will it overflow
假设在有问题的平台上 int
是 32 位宽(并且 time_t
是 integral 类型,会说它不是 struct
例如),就做
printf("%s\n", asctime(localtime(&(time_t){difftime(INT_MAX, 0)})));
你知道的。
它打印:
Tue Jan 19 04:14:07 2038
将参数交换到 difftime()
可以得到 "earliest" 日期,顺便说一句:
printf("%s\n", asctime(localtime(&(time_t){difftime(0, INT_MAX)})));
打印
Fri Dec 13 21:45:53 1901
我正在做 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));
一种方法是使用 UNIX date
命令。具体来说,date -d '@<seconds>'
将输出自 UNIX 纪元以来 <seconds>
秒对应的日期和时间。此外,如果您只关心年份,可以提供格式说明符 +%Y
。
因此,对于此示例,您将执行
date -d '@2147483647' +%Y
并会看到输出 2038
。
该方法可能看起来很幼稚,但几乎是准确的。您需要考虑闰年和闰秒。
关于 UNIX 时间的维基百科页面在某处提到了 2038 年。在那里您可以找到其余的详细信息。
when will it overflow
假设在有问题的平台上 int
是 32 位宽(并且 time_t
是 integral 类型,会说它不是 struct
例如),就做
printf("%s\n", asctime(localtime(&(time_t){difftime(INT_MAX, 0)})));
你知道的。
它打印:
Tue Jan 19 04:14:07 2038
将参数交换到 difftime()
可以得到 "earliest" 日期,顺便说一句:
printf("%s\n", asctime(localtime(&(time_t){difftime(0, INT_MAX)})));
打印
Fri Dec 13 21:45:53 1901