Linux 时钟会在 2038 年 1 月 19 日 3:14:08 失效吗?

The*_*nce 24 time

我有点担心这个。这就是所谓的“2038年问题”。从 12.04 开始,Linux 内核或 Ubuntu 是否已准备好处理此后的日期?

Rad*_*anu 14

不,它不会失败。在最坏的情况下,从程序员的角度来看,它将按预期工作:将重置为日期 1901-12-13 20:45:52:

在此处输入图片说明

以防万一,在这种情况发生之前,您不会更新当前的发行版。“更新很容易。其中一个更新肯定会包含修复程序。 ”就像chocobai说的那样。

我记得在 2000 年之前的 16 位机器上是同样的问题/问题,最后它没有任何问题。

来自维基百科的解决方案:

大多数设计为在 64 位硬件上运行的操作系统已经使用有符号的 64 位time_t整数。使用带符号的 64 位值引入了一个新的环绕日期,该日期比估计的宇宙年龄大 20 多倍:从现在开始大约 2920 亿年,即 292,277,026,596 日(星期日)15:30:08。对日期进行计算的能力受到以下事实的限制tm_year使用从 1900 年开始的有符号 32 位 int 值。这将年份限制为最大值 2,147,485,547 (2,147,483,647 + 1900)。虽然这解决了执行程序的问题,但并没有解决在二进制数据文件中存储日期值的问题,其中许多采用严格的存储格式。它也无法解决在兼容层下运行的 32 位程序的问题,并且可能无法解决将时间值错误地存储在time_t.

我在 64 位上使用 Ubuntu 13.04,出于好奇,我手动将时间更改为 2038-01-19 03:13:00。03:14:08 之后什么也没发生:

2038-01-19 03:14:08之前的日期和时间 2038-01-19 03:14:08之后的日期和时间

所以这个问题没什么好担心的。

更多关于:

  • 我不同意?从程序员的角度来看,时钟不应该重置,所以它_将_失败 (10认同)
  • 如果它重置,它就会失败,因为“失败”我的意思是“不工作或工作不正确”。 (9认同)
  • 评论中的讨论毫无意义。问题是“Linux 内核或 Ubuntu 是否准备好在此之后处理日期?”。好吧,它无法处理此类日期,因此在此问题的上下文中失败。 (3认同)
  • @gertvdijk “Linux 内核或 Ubuntu 是否准备好在此之后处理日期?” (2认同)

小智 7

您可以使用以下 Perl 脚本检查计算机的时间是否会崩溃:

#!/usr/bin/perl
use POSIX;
$ENV{'TZ'} = "GMT";
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
    print ctime($clock);
}
Run Code Online (Sandbox Code Playgroud)

如果你的电脑没问题,你会得到这个:

Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038       <-- Last second in 32-bit Unix systems
Tue Jan 19 03:14:08 2038
Tue Jan 19 03:14:09 2038
Tue Jan 19 03:14:10 2038
Run Code Online (Sandbox Code Playgroud)

如果你的电脑和我的一样,它会像这样环绕:

Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901
Run Code Online (Sandbox Code Playgroud)

它也可以这样做:

Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:07 2038
Run Code Online (Sandbox Code Playgroud)

  • 确认的。如果你有一台 64 位机器,那么这会很好。此外......我们中谁会在 2038 年拥有仍在运行的 32 位机器? (2认同)