time_t 环绕日期

time_t wrap around 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 和 LONG_MAX 一样是 8 个字节。当我 运行 我得到:

当前日期:2015 年 2 月 1 日星期日 17:29:09 以及,死亡结束日期:(空) 但是当我设置 end=INT_MAX; 时,我得到死亡日期:1 月星期二 05:14:07 2038 那么 为什么我得到 LONG_MAX 的 (null)?而不是正常日期

64 位长将在 292,277,026,596 年左右的某个地方进行环绕,这是从现在算起的宇宙当前年龄的约 20 倍。由于地球自转不太可能一直持续到那个时候,人们也不太在意,所以那个时候很容易return (null).


开个玩笑,真正的原因很可能是 ctime 算法可能使用 localtimetime_t 转换为故障时间,并且使用 int年份值。


以下 python 脚本可用于查找 time_t 的最大值,ctime 不会抛出异常(它是 libc ctime,C 中的实现留作 reader):

的练习
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。