new Date() 体系时刻从1970年开端核算ITeye - 牛牛娱乐

new Date() 体系时刻从1970年开端核算ITeye

2019年04月01日13时52分30秒 | 作者: 鸿轩 | 标签: 时刻,体系,开端 | 浏览: 112

(有意思的冷常识)

许多程序语言里,界说time 从 1970 年 1 月 1 日开端,遽然想到在 Java 里, Oracle 数据库时刻也是从 1970

年 1 月 1 日开端核算。比方 java 类代码 
Date date = new Date(0);

System.out.println(date);
打印出来的成果: 
Thu Jan 01 08:00:00 CST 1970
也是1970 年 1 月 1 日,实践上时分秒是 0 点 0 分 0 秒 ( 这儿打印出来是 8 点,稍后会作解说 ) 。
为什么这个时刻会界说在1970 年 1 月 1 日这个时分呢 ? 
所以开端了Google ,中文网页底子找不到答案。 所以试着查找英文关键字 , 在 Sun java 论坛总算找到精确的帖子 : 
http://forums.sun.com/thread.jspa?threadID=595140 start=15
其中有一个回复: 
I suspect that Java was born and raised on a UNIX system.
UNIX considers the epoch (when did time begin) to be midnight, January 1, 1970.
是说java 起源于 UNIX 体系,而 UNIX 以为 1970 年 1 月 1 日 0 点是时刻纪元 . 
但这仍然没很好的解说" 为什么 ", 出于猎奇,持续 Google ,总算找到了答案 : 
http://en.wikipedia.org/wiki/Unix_time
这儿的解说是: 
开端核算机操作体系是32 位,而时刻也是用 32 位表明。 
System.out.println(Integer.MAX_VALUE);
2147483647
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 天然也遵从了这一束缚。 

至于时刻回归的现象信任跟着64 为操作体系 的发生逐步得到解决,由于用 64 位操作
体系能够表明到 292,277,026,596年 12月 4 日 15时 30 分 08 秒,信任咱们的 N 代后代,哪
怕地球消灭那天都不必愁不行用了,由于这个时刻现已是千亿年今后了。

最终一个问题:上面System.out.println(new Date(0)),打印出来的时刻是8点而非0点,
原因是存在体系时刻和本地时刻的问题,其实体系时刻仍然是0点,只不过我的电脑时区
设置为东8区,故打印的成果是8点。
(我想以上问题假如作为面试题,也能难倒一批人吧)
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2

    修饰符ITeye

    润饰,能够,直接
  • 3
  • 4
  • 5

    第02章 根底中心ITeye

    目标,根底,中心
  • 6
  • 7
  • 8

    Java中字符串的使用ITeye

    字符串,字符,比较
  • 9
  • 10

    UTLITeye

    数据,目录,文件