64位Ubuntu系统的时间戳,2038年问题

tet*_*tet 24 64-bit time 14.04

我正在使用 64 位 Ubuntu 系统。

我目前正在研究一个包含 MariaDB 的项目。我计划在项目中引入时间戳技术,以便人们将收到不同时区的正确时间。

我听说并阅读了一些关于 2038 年时间戳问题的文章。许多文章建议我们使用 64 位系统来多买“位”的时间。

这个“位”指的是多少时间?到最后我们能够管理 Web 应用程序的时间是否足够长?如果情况并非如此,是否就像只延长两年一样,那么当 2040 年到来时,我们是否会有无法正常工作的应用程序?

Oli*_*Oli 34

好吧,如果可以选择从字面上购买“位”,即从有符号的 32 位整数转换为无符号的 32 位整数,那么事情会一直工作到 2106。

转移到 64 位是“好一点”。您将获得数千亿年的分辨率。

Ubuntu 是这样做的:

$ uname -p
x86_64

$ date --date=9090-01-01 +%s
224685532800
Run Code Online (Sandbox Code Playgroud)

但是,这是操作系统级别。仅仅因为 Ubuntu 使用 64 位整数作为其时间并不意味着 MySQL/MariaDB 将使用它来存储其时间戳。如果 2038 年以后的日期对您现在很重要,请立即开始测试。

实际上,我可以为您节省一些时间。它还是坏了。这个错误是十多年前报告的,但它的主要测试仍然以 64 位整数失败。

mysql> select from_unixtime(2548990800);
+---------------------------+
| from_unixtime(2548990800) |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

这甚至不是存储。有点可怜。

(是的,它是在 MariaDB 10.1 版上运行的)

  • 10 年过去了,他们还有 22 年的时间来修复它。<交叉手指>... (8认同)
  • 注意:使用无符号 32 位整数是 [a hack](https://xkcd.com/376/)。 (4认同)

dob*_*bey 6

根本不要将它存储为整数。将其存储为ISO 8601格式的日期字符串。这是 Internet 上使用的标准格式。

9999-12-31T23:59:59+00:00
Run Code Online (Sandbox Code Playgroud)

  • 让我们一起为 Year10K Bug 举杯!;) 但说真的,虽然字符串确实可以扩展,但它们相对较大(您的示例是 200 位!)并且解析和操作原始数字的速度快了无数倍。那很重要。 (17认同)
  • 这是用于显示的绝佳格式 - 仅此而已。对于其他任何事情(即,处理数据直到您决定将其格式化给用户的最后一刻),例如比较、进行算术等。将 Unix 时间戳作为整数(或浮点数)要好得多。 (6认同)