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年的时候,我们相信可以应对这次危机。

相关文章
|
5月前
|
人工智能 算法 大数据
2024年9月,程序员的焦虑!
程序员的焦虑源于行业内的激烈竞争与技术快速迭代。一方面,某些编程语言虽广泛使用,但市场已趋饱和;另一方面,大语言模型(LLM)的普及大幅提升了开发效率,使经验与创新能力变得更为关键。面对未来,可考虑三大方向:一是人工智能,不仅是算法研究,还包括大数据处理与应用;二是嵌入式,与AI结合有广阔前景;三是云计算,支撑大规模模型运行所需的强大计算与存储能力。这些方向将为程序员提供新的机遇。
182 3
|
9月前
|
程序员 项目管理
程序员35岁会失业吗
一名有企业经验的博士生认为,虽然程序员的中年危机并非必然导致失业,但35岁时需应对技术快速发展的挑战。关键在于理解新技术对职业的影响,持续学习(如参加培训、阅读技术资料),关注行业趋势,专注特定领域以成为专家,参与开源项目和技术社群,以及培养软技能。通过这些策略,资深程序员能保持竞争力。
|
架构师 程序员
程序员如何度过30岁危机?
程序员如何度过30岁危机?
|
程序员 计算机视觉
事关每个程序员的职业规划与履历
今天,甚至过去,大多数人都是由自己来设计他们的职业生涯的。 无论你正要启程,还是已经奋斗多年,以下内容都会对您的职业生涯有所助益。
172 0
|
设计模式 人工智能 架构师
四十不惑,程序员的中年危机,你经历了吗?
  今年刚好 40 岁,在一家著名外企做到技术专家的位置,在亲戚朋友眼中,俨然已算半个“成功人士”,但内心深处,却无一刻不战战兢兢。我知道,自己就像一个风雨中的高跷人,哪怕一阵风,一个闪失,都会重重跌倒,甚至于再也爬不起来。   我有一个习惯,每年定期更新简历,一则看是否有更好的机会,二则了解市场行情与技术动向,也作为自己下一年努力的方向。   从 30 岁到 40,整整 10 年,年年如斯,这种形式一直有效的鞭策我努力学习和工作。因为我相信只要我保持努力,就会永远站在技术的前沿,就会永远保有强劲竞争力,所谓的“中年危机”永远也不会落在我的头上。
246 0
|
程序员 开发工具 IDE
对程序员非常重要的24个软技能
英文原文:Soft Skills are so important to Software Engineers   软技能通常是被低估的。几乎所有的软件工程师都知道要关注技术的提高,但你忽视的软技能很可能会影响你的职业生涯。
1139 1
|
架构师 大数据 Java
程序员的职业规划!
在这个节点讲讲我对职业发展路径的理解,另外就是理一理脑子里的一些思路。过段时间再看此文又可能是另一番理解。很多路从后往前看的时候总会有遗憾,要是当初怎么怎么样就会怎么怎么样。导致这样的原因的第一个原因是人在做决策的时候由于各种不全导致了决策本身并不完美,即使当时完美可能后面看来也可能是不完美的,也有可能做出完全错误的决策(PS:如果孤立的讨论决策本身没有完全错误的决策,也可以认为是没有意义的)。
1124 0
|
安全 程序员
【观点】如果你不是程序员 该如何雇佣程序员呢
导读:原文来自37signals.com,作者Matt发表的一篇《How to hire a programmer when you're not a programmer》。译文由国内整理编译为《如果你不是程序员,你怎么雇佣程序员呢》。
1061 0
|
架构师 Java 程序员
程序员的悲哀:年近40找不到工作,中年危机悄然来临!
君不见,去互联网公司走一走,你会发现,那些做开发写代码的基本上都是清一色的小伙子,基本上不会见到大龄码农的身影。 有很多程序员笑言:写代码是一个体力活,年纪越大,加班就吃不消了。
2647 0
|
Java 程序员 定位技术
程序员职业规划的3个锦囊
我们在面试时经常会被问到一个问题——“你未来五年的职业规划是什么?”很多小伙伴不理解HR为什么这么问,也不知道怎么回答。 实际上,即便HR不问,我们也应该多多想想这个问题。因为它指向的是我们自己的职业生涯规划。
6885 0

相关实验场景

更多