time_t环绕日期

时间:2015-02-01 15:38:51

标签: c date

我试图找出时间超过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?而不是正常日期

1 个答案:

答案 0 :(得分:3)

64位长会在292,277,026,596左右的某个地方进行环绕,这是现在宇宙当前年龄的20倍。由于地球的旋转在那个时候不太可能存在,人们也不会真正关心它,那时它很容易返回(null)


开玩笑最有可能真正的原因是ctime算法可能会使用localtimetime_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.