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

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

我正在使用 64 位 Ubuntu 系统。

我目前正在从事一个包含 MariaDB 的项目。我计划将时间戳技术引入到项目中,以便人们能够获得不同时区的正确时间。

我听过和读过一些关于 2038 年时间戳问题的文章。许多文章建议我们使用 64 位系统来争取“多一点”时间。

这个“点”指的是多长时间?这段时间足够我们管理 Web 应用程序直到最后吗?如果不是这样,是不是只能延长两年,那么到 2040 年,我们是否将拥有无法正常运行的应用程序?

答案1

好吧,如果有一个选项可以真正购买一个“位”,即从有符号的 32 位整数转换为无符号的 32 位整数,那么事情就会一直持续到 2106 年。

转换到 64 位“稍微好一些”。你可以获得数千亿年的分辨率。

Ubuntu 是这样做的:

$ uname -p
x86_64

$ date --date=9090-01-01 +%s
224685532800

但是,这是操作系统层面的问题。Ubuntu 使用 64 位整数来计算时间,但这并不意味着 MySQL/MariaDB 也会使用它来计算时间。店铺它的时间戳。如果 2038 年以后的日期对你来说很重要,请立即开始测试。

事实上,我可以为你节省一些时间。它仍然坏了。这个漏洞十多年前就被报告过但其主要测试仍然因 64 位 int 而失败。

mysql> select from_unixtime(2548990800);
+---------------------------+
| from_unixtime(2548990800) |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)

这甚至都算不上存储。这有点可悲。

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

答案2

不要将其存储为整数。将其存储为ISO 8601格式化的日期字符串。这是整个互联网使用的标准格式。

9999-12-31T23:59:59+00:00

相关内容