世界末日是什么时候?这个无意义的问题总是有各种稀奇古怪的答案。当你打开手机系统设置(不是日历),关闭自动时间设置,向未来方向滑动数字时,你会发现时间已经停止在2038年了。
小米和华为可以设置到2037年12月31日,而iPhone只剩下两天了。
不仅在手机上,在电脑上,当你尝试从2037年向上调整时间时,你会发现无论你如何按设置按钮,日期都不会继续改变。
当日期调整超过2038年时,将于2038年1月1日停止
2038年到底会发生什么?为什么所有类型的设备都无法在2038 年生存?在网上搜索2038,还可以发现有人专门设置了倒计时页面。其中包括更精确的时间:2038 年1 月19 日3:14:07。下一秒,你的电子设备将回到1901 年。
著名的2038问题将在此时爆发。
到2038年,当问题出现时,仍然会有……
2038年,时间摧毁系统
该问题发生在2038年1月19日3:14:07之后的第二秒。这一天的03:14:08不会来。相反,您将在1901 年12 月13 日收到20:45:52 的问候。
使用脚本模拟系统时间,会出现时间跳跃的情况(平台Debian GNU/Linux(内核2.4.22))|威廉波奎特/deepsky.com
对于许多电子设备来说,这是毁灭性的打击。文件的创建和修改、应用软件的运行、网络系统的同步……时间作为一个关键值,在整个电子系统中起着绝对重要的作用。因此,有一段时间,苹果语音助手Siri将这一天视为世界末日。为什么是这一天? Siri 答案中的关键词也给出了答案。
早期Siri对末日问题的回答(这个答案在新版本系统中不再有)
Unix、32位,这两个词让2038年的这一天注定是结束。 Unix是一个操作系统。本系统中的计时方法以1970年1月1日00:00:00为单位,以秒为单位增减。例如,2022年1月1日0:00,只需在基值上加上1640966400秒即可。我们现在使用的Android和Apple系统都是类Unix系统,采用相同的解决方案。
电子系统使用0 和1 存储数据,也称为二进制。如果只用1位数字,则只能表示0和1。如果用2位数字,则可以用00、01、10、11分别表示0、1、2、3这四个数字。随着位数的增加,二进制所能表示的数字也越来越大,但总会有一个上限。如果用32个0和1来存储数字,第一位代表符号,0代表+,1代表-,那么剩下的31位最多可以代表2147483647。在计算机资源非常宝贵的时代,使用32位来存储时间就足够了。
1970 年1 月1 日00:00:00 + 2147483647 秒=2038 年1 月19 日3:14:07。下一秒,数据就装不下了,就会发生溢出。这时,第一个符号位从0变成了1,原来的加号变成了减号,时间突然穿越到了过去。
从上到下分别是二进制秒、对应的十进制秒、32位Unix系统时间、实际时间。超过2147483647,符号位变为1(减号),整个数字突然翻转,回到1901。丨Pemu/Wikicommons
这个问题会对我们未来产生什么影响?回顾过去,一次又一次的千年问题给了我们一些警示。
千年虫来自千年之外
2000年,千禧年。对于许多应用程序来说,年份看起来像是1900 年。
也因为硬件资源宝贵,早期的程序使用年份的最后两位数字来表示日期,前两位数字默认为19。这个不起眼的时间问题引起了全世界的巨大关注。政务系统、银行系统、航空系统等很多系统都可能受到影响而出现故障。世界各地纷纷做出回应,试图解决这个问题。我国已经出台了很多文件强调这个问题的重要性。美国还提出了有关千年虫问题的法案,敦促各行业共享信息以解决此类问题。
感谢人们对千年虫的高度重视,这个问题在集中爆发前得到了解决。但此后,类似千年虫的事件不断出现。
2010年第一周,德国约有3000万张银行卡同时到期。持卡人不仅无法直接刷卡消费,连ATM机取款都成问题。这不仅影响了该国居民的生活,也让正在度假的德国人滞留在当地。
由于编码差异,2010 年在德国银行系统中被错误地识别为2016 年。银行卡也过期了。同样的情况也出现在Windows Mobile系统的手机上:你在2010年第一天收到的新年短信,系统会显示为2016年。
德国加速修复银行系统,但幸运的是没有造成更大的损失。但放眼太空,事情就没那么简单了。 2013年9月,“深度撞击”号飞船突然失去联系,迫使NASA宣布正式结束相关探索任务。 Deep Impact 的首席任务科学家Mike A'Hearn 认为这是一个千年问题。航天器的部分软件无法正确识别2013 年8 月11 日之后的日期,导致计算机不断重新启动。最终,科学家们失去了航天器的信号。
深度撞击与坦普尔1号彗星相遇的模拟|美国宇航局
就在今年年初,2022年的bug让微软程序员尝到了新年加班的滋味。 1月1日,微软的电子邮件服务系统Exchange突然停止服务,使用该服务的用户无法发送电子邮件。微软随后发表声明,称该问题与日期检查失败和新年更改有关。简单来说,就像2038问题一样,时间已经溢出了。幸运的是,微软团队加班加点,当天就解决了问题。
未来,千年虫之类的问题肯定会再次出现。人们已经开始尝试为可预见的问题提供解决方案。例如,使用新的格式来存储时间信息。同时,系统团队提供的新内核也在解决32位平台上的历史问题。你也不用太担心,毕竟到时候你的手机应该已经换好几次了。
不过,再次遇到类似的意外bug也是很正常的。因为世界上总有合理和意想不到的事情发生。