什么是2038年的问题?如何找出现有代码是否存在问题并解决?

时间:2011-06-20 09:03:25

标签: c time year2038

  

可能重复:
  What should we do to prepare for 2038?

2038年的问题是什么?

如何找出我们的代码是否有问题并解决它?

3 个答案:

答案 0 :(得分:2)

在C中,标准的4字节格式假定时间的开始时间是1970年1月1日,上午12:00:00。该值为0.转换为负数之前的最大时间值(且无效) )值为2,147,483,647,转换为2038年1月19日。在此日期,任何使用标准时间库的C程序都将开始出现日期计算问题。要更正它,只需使用新版本的库重新编译程序即可。使用8字节值作为存储格式。

答案 1 :(得分:2)

试试这个:如果第二行(和第三行)不在2038年,你的系统就会出现2038年问题。

#include <stdio.h>
#include <time.h>

int main(void) {
  time_t x;

  x = (time_t)((1U << 31) - 1);
  printf("%s\n", ctime(&x));
  x += 1;
  printf("%s\n", ctime(&x));
  x += 1;
  printf("%s\n", ctime(&x));

  return 0;
}

ideone处的代码“正在运行”:有问题的系统
代码“正在运行”codepad:有问题的系统

答案 2 :(得分:0)

自0000:00 UTF以来,以无符号整数形式存储或使用系统时间的程序将在2038年1月19日超出范围。虽然大多数软件将在2038年遇到此问题,但存储未来日期的软件将会早点受到影响。

解决方法需要重新编译(相关)代码,以更大的存储格式存储时间。看起来所有的编译器提供商已经准备好了解决方案。

此外,64位操作系统已经为所有时间整数使用64位包装器。这将使危险远远超出我们的时间范围。让下一代产生更好的解决方案。