2038年问题

本页使用了标题或全文手工转换,现处于中国大陆简体模式
求闻百科,共笔求闻
2038年问题演示:第一行是“time_t”数字的二进制表示;第二行是其十进制表示;第三行是受影响的计算机理解的时间;第四行是实际的时间
2038年问题
大部分的32位操作系统 - 2038年1月19日
距今还有5005
以当地时间计算
如果发现倒数时间不准确,请刷新页面缓存

在计算机应用上,2038年问题可能会导致某些软件在2038年1月19日3时14分07秒之后无法正常工作。所有使用POSIX时间表示时间的程序都将受其影响,因为它们以自1970年1月1日经过的秒数(忽略闰秒)来表示时间[1]。这种时间表示法在类UnixUnix-like)操作系统上是一个标准,并会影响以其C编程语言开发给其他大部分操作系统使用的软件。在大部分的32位操作系统上,此“time_t”数据模式使用一个有正负号的32位整数(signed int32)存储计算的秒数。依照此“time_t”标准,在此格式能被表示的最后时间是2038年1月19日03:14:07,星期二(UTC)。超过此一瞬间,时间将会“绕回”(wrap around)且在内部被表示为一个负数,并造成程序无法工作,因为它们无法将此时间识别为2038年,而可能会依个别实现而跳回1970年1901年。因此可能产生错误的计算及动作。

有少数的情况下,在制定规格时,特别规定以无正负号的32位整数(unsigned int32)存储 POSIX 时间,因此错误会被延后到 2106 年。例如比特币区块链中的区块时间戳记,就是以这种方法存储。[2][3]

目前并没有针对现有的CPU操作系统搭配的简单解决方案。直接将POSIX时间更改为64位模式将会破坏对于软件、数据存储以及所有与二进制表示时间相关的部分的二进位兼容性。更改成无符号的32位整数则会影响许多与两时间之差相关的程序。不过,那时使用32位系统的计算机可能会很少。

大部分64位操作系统已经把time_t这个系统变量改为64位宽。不过,其他现有架构的改动仍在进行中,不过预期“应该可以在2038年前完成”。然而,直到2006年,仍然有数以亿计的32位系统在运行中,特别是许多嵌入式系统。相对于一般电脑科技18至24个月的革命性更新,嵌入式系统可能直至使用寿命终结都不会改变。32位time_t的使用亦被编码于文件格式,例如众所周知的ZIP文件压缩格式。其能存在的时间远比受影响的机器长。

新的64位运算器可以记录至约2900亿年后的292,277,026,596年12月4日15:30:08,星期日(UTC)。

任何使用32位表示时间的系统都有内在的错误风险。有一些知名的数据结构存在这个问题:

  • 文件系统(许多文件系统使用32位表示时间)
  • 二进制文件格式(使用32位时间的)
  • 数据库(使用32位时间的)
  • 有类似UNIX_TIMESTAMP()命令的数据库查询语言(例如SQL

早期问题

在2006年5月,AOLserver软件的报告提前显示了一次2038年问题。这款软件被设计为处理一个应当“永远不会”超时的数据库请求。最初的设计只确定了一个在未来的超时日期,而不是特殊处理这个特例。服务器的默认配置确定请求应在十亿秒后超时。2006年5月13日后十亿秒(大致为31年251天)超过了2038年的错误时间。所以,这个时间之后,超时计算溢出,并返回了一个实际在过去的日期,导致软件崩溃。当发现问题时,AOLServer操作员不得不编辑了配置文件,并讲超时时间设为一个较低的值。[4]

解决方案

2038年问题没有通用的解决方案。像在C语言中,任何对time_t 数据类型定义的改变都会在涉及其本质(32位有符号整数)的应用中导致代码兼容性问题。大部分在64位硬件上运行的操作系统都已采用64位整数表示 time_t ,可以避免此问题。

参考文献

参见

外部链接