2038 年可能是程序员一场危机!

简介: 2038 年可能是程序员面临的一道坎,因为这关乎时间戳的问题。

前言


大家好,我是小林。

2038 年可能是程序员面临的一道坎,因为这关乎时间戳的问题。

今天就跟大佬唠嗑下这个事情。

文章选自维基百科:2000年问题和2038年问题,感兴趣读者可以自行阅读英文版,信息量更大一些。


正文


2000 年问题


千年虫问题,是指由于计算机程序设计的一些问题,使得计算机在处理2000年1月1日以后的日期和时间时,可能会出现不正确的操作,从而可能导致在2000年1月1日零点工作停顿甚至是发生灾难性的结果。

一般来说,由于计算机程序中使用两个数字来表示年份,如1998年被表示为98、1999年被表示为99,而2000年被表示为00。

这样将会导致某些程序在计算时得到不正确的结果,如把“00”误解为1900年。在嵌入式系统中可能存在同样的问题,这有可能导致设备停止运转或者发生更加灾难性的后果。

画外音:这个对于我们程序员来说很好理解,有时候不知道业务发展会怎么样,基于资源和当时的发展情况来考虑,设置空间余量不足,也是常有的事情。


2038年问题


UNIX操作系统是美国AT&T公司贝尔实验室于1969年完成的操作系统,最早Ken Thompson、Dennis Ritchie、Douglas McIlroy于1969年在AT&T贝尔实验室开发。

于1971年首次发布,最初是完全用汇编语言编写。后来在1973年用一个重要的开拓性的方法,Unix被丹尼斯·里奇用编程语言C重新编写,高级语言编写的操作系统具有更佳的兼容性,能更容易地移植到不同的计算机平台。

#ifndef __TIME_T
#define __TIME_T
typedef  long  time_t;
#endif

在32位系统中time_t实际是一个4字节的有符号长整型,其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒到当前时刻的秒数。

由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分07秒(UTC),那么当时间戳到达最大值2147483647会发生什么呢?

画外音:要理解2038年问题就必须要理解time_t和signed 32bit的计数。


2038-01-19 03:14:08


43.png

44.png

42.png

画外音:这好像还是个大事情,一下子回到了1901年……


32位操作系统


在计算机应用上,2038年问题可能会导致某些软件在2038年1月19日3时14分07秒之后无法正常工作。

所有使用POSIX时间表示时间的程序都将受其影响,因为它们以自1970年1月1日经过的秒数(忽略闰秒)来表示时间。

在大部分的32位操作系统上,time_t使用一个有正负号的32位有符号整数存储计算的秒数。依照time_t标准,在此格式能被表示的最后时间是2038年1月19日03:14:07,星期二(UTC)。

一旦超过这个时刻,时间将会绕回且在内部被表示为一个负数,并造成程序无法工作,因为它们无法将此时间识别为2038年,而可能会依个别实现而跳回1970年或1901年。因此可能产生错误的计算及动作。

我们来看下官方的警告:

41.png

画外音:官方警告最为真实…


64位操作系统


大部分64位操作系统已经把time_t这个系统变量改为64位,但是仍然有数以亿计的32位系统在运行中,特别是许多嵌入式系统。

32位time_t的使用亦被编码于文件格式,例如众所周知的ZIP文件压缩格式。其能存在的时间远比受影响的机器长。

新的64位运算器可以记录至约2900亿年后的292,277,026,596年12月4日15:30:08,星期日(UTC),基本上可以彻底解决时间回环问题。

画外音:换了64位 舒服了…


2038年问题的影响


2038年问题与之前的千年虫问题的杀伤力是不一样的,千年虫属于应用程序的问题,而2038年问题却是系统级的,有更大的杀伤力。

Linux Kernel 5.6 的开发者已经准备好着手解决将在下一个十年到来的 2038 年问题。Linux 5.6 也成为第一个为 32 位系统准备运行到 2038 年之后的主线内核。

40.png

至于像MySQL等组件同样面临2038年问题,目前还有17年的时候,我们相信可以应对这次危机。

相关文章
|
程序员
一张图道尽程序员的出路
原文转自:http://blog.csdn.net/foruok/article/details/40585139     最近在琢磨程序员到底路在何方,经过不断的自虐和代入,终于在迷雾森林中得图一张,看之豁然开朗。
1592 0
|
1月前
|
程序员 项目管理
程序员35岁会失业吗
一名有企业经验的博士生认为,虽然程序员的中年危机并非必然导致失业,但35岁时需应对技术快速发展的挑战。关键在于理解新技术对职业的影响,持续学习(如参加培训、阅读技术资料),关注行业趋势,专注特定领域以成为专家,参与开源项目和技术社群,以及培养软技能。通过这些策略,资深程序员能保持竞争力。
|
10月前
|
程序员 测试技术
|
9月前
|
架构师 程序员
程序员如何度过30岁危机?
程序员如何度过30岁危机?
|
安全 架构师 程序员
二哥跟你聊聊程序员的出路
所谓路,途也,道也,古人有云:路漫漫其修远兮,吾将上下而求索;歌曲有唱:敢问路在何方,路在脚下;我心有念:流年似水,三十将至,然迷,不复得路。
二哥跟你聊聊程序员的出路
|
设计模式 人工智能 架构师
四十不惑,程序员的中年危机,你经历了吗?
  今年刚好 40 岁,在一家著名外企做到技术专家的位置,在亲戚朋友眼中,俨然已算半个“成功人士”,但内心深处,却无一刻不战战兢兢。我知道,自己就像一个风雨中的高跷人,哪怕一阵风,一个闪失,都会重重跌倒,甚至于再也爬不起来。   我有一个习惯,每年定期更新简历,一则看是否有更好的机会,二则了解市场行情与技术动向,也作为自己下一年努力的方向。   从 30 岁到 40,整整 10 年,年年如斯,这种形式一直有效的鞭策我努力学习和工作。因为我相信只要我保持努力,就会永远站在技术的前沿,就会永远保有强劲竞争力,所谓的“中年危机”永远也不会落在我的头上。
195 0
|
程序员
[译] 作为程序员你不能成功的 10 个迹象
编程是人类的基本技能,就像阅读、写作和算术一样。任何人都可以通过时间和努力学习编程。
3154 0
|
架构师 Java 程序员
程序员的悲哀:年近40找不到工作,中年危机悄然来临!
君不见,去互联网公司走一走,你会发现,那些做开发写代码的基本上都是清一色的小伙子,基本上不会见到大龄码农的身影。 有很多程序员笑言:写代码是一个体力活,年纪越大,加班就吃不消了。
2556 0
|
程序员
程序员怎样渡过中年危机?
真的是危机? 直接上图,这特么哪里是危机,明明是金矿啊。直接用人民币直接消除了所谓的中年危机? 但是,你说我明明感觉很焦虑,很烦躁,一眼就看到底了,我一辈子就是一个程序员,那你说这能不焦虑么? 其实真正的危机,来源于在正确的时间做不正确的事。
1106 0

相关实验场景

更多