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
算法可能使用 localtime
将 time_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。
我正在尝试找出时间溢出 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
算法可能使用 localtime
将 time_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。