我试图找出时间超过time_t值的日期
#include <stdio.h>
#include <time.h>
#include <limits.h>
main(){
time_t now,end;
now=time(NULL);
end=LONG_MAX;
printf("Current date : %s\n",ctime(&now));
printf("Date of death : %s\n",ctime(&end));
}
我发现在我的系统上time_t是8个字节,如LONG_MAX。当我运行它时,我得到:
当前日期:2015年2月1日星期日17:29:09以及结束死亡日期:( null)
但是当我设置end=INT_MAX;
时我会得到死亡日期:Tue Jan 05:14:07 2038所以为什么我得到(null)LONG_MAX?而不是正常日期
答案 0 :(得分:3)
64位长会在292,277,026,596左右的某个地方进行环绕,这是现在宇宙当前年龄的20倍。由于地球的旋转在那个时候不太可能存在,人们也不会真正关心它,那时它很容易返回(null)
。
开玩笑最有可能真正的原因是ctime
算法可能会使用localtime
将time_t
转换为细分时间,并使用int
作为年份值。
以下python脚本可用于查找time_t
不会引发异常的ctime
的最大值(它是libc ctime
的一个瘦包装器,实现于C留作读者的练习):
import time
t = 0
for i in range(56, -1, -1):
try:
newt = t + (2 << i)
time.ctime(newt)
t = newt
except ValueError:
pass
print("Maximum value", bin(t))
print("Date at maximum", time.ctime(t))
我的电脑上的代码输出,glibc 2.19:
Maximum value 0b11110000110000101001110110000110100010111110000101011010
Date at maximum Tue Dec 31 23:59:52 2147483647
2147483647是2 ^ 31 - 1.