最新文章:

首页 转载文章

2038年问题

发布时间:2017年02月08日 评论数:抢沙发 阅读数:261

    java起源于UNIX系统,而UNIX认为1970年1月1日0点是时间纪元。

          最初计算机操作系统是32位,而时间也是用32位表示。 Integer在JAVA中用32位表 示,因此32位能表示的最大值是2147483647。 另外1年365天的总秒数是31536000, 2147483647/31536000 = 68.1。

      也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07 秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为 10000000 00000000 00000000 00000000,也就是1901年12月13日20时45分52秒,这样便会出现时间回归的现象,很多软件便会运行异常了。

      所以说,因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算 机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间,而java自然也遵循了这一约束。

    2038年问题
           和21世纪初的千年虫(the Millennium bug)问题类似,32位的Unix操作系统和Linux操作系统时间溢出问题又称为2038年问题(the Year 2038 problem)。如果你想知道什么是2038问题的话,你需要知道一些技术上的东西。这个bug是由用来写Unix/Linux的C语言引起的,C语言中用 time_t 来代表时间和日期,time_t 是整数(int)型的,它用来记载从1970年1月1日到2000年所经历的秒数。
    这个数据是以32位存储的,第一位是符号位,其余的31位用来存数字,而这31位数字可以存储的最大数字为2147483647。
           从1970年开始计算,这31位的数字可以表示的秒数最多可以用到2038年,当时间到达这个数字的时候系统将会出现问题,到时候数字不会自动增加,而是会变为-2147483647,而这串数字代表的时间是1901年12月13日,这会导致很多的程序出现问题,甚至崩溃。
    2038年问题不仅比千年虫更隐蔽,而且比之前千年虫问题更具有破坏力,因为千年虫问题只会导致应用层的程序出现问题,比如信用卡支付系统,或者管理系统。而2038这个bug,将会影响系统最底层的时间控制的功能。
           要解决这个问题,最简单的方式是扩展Unix时间的长度,用64位数字来表示它。64位二进制数的实际可用位数是63位,最大表示到公历的UTC时间292277026596年12月4日. 如果那个时候人类文明还存在的话,公元纪年很可能已经因为太难用而被抛弃了. 

     

二维码加载中...
本文作者:幻陆      文章标题: 2038年问题
本文地址:http://www.hyunlu.com/?post=82
版权声明:若无注明,本文皆为“幻陆”原创,转载请保留文章出处。
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论
sitemap