avatar

Java为啥计算时间从1970-1-1开始

引言

Java中计算开始时间是从1970年1月1日开始的,但是为什么从1970年开始呢?其他语言也是从1970年1月1日开始么?

Java时间计算起点

我们都知道,在Java中执行下面的代码会打印Thu Jan 01 08:00:00 CST 1970(系统时区设置为UTC+08:00-也就是北京时间) (如果设置为UTC世界时则会打印Thu Jan 01 00:00:00 CST 1970)

System.out.println(new Date(0));

为什么这个时间会定义在1970 年 1 月 1 日这个时候呢 ?
一番百度+Google,得到了以下答案:

java 起源于 UNIX 系统,而 UNIX 认为 1970 年 1 月 1 日 0 点是时间纪元,所以java也遵循unix的这套时间系统。

哪UNIX为什么要以1970 年 1 月 1 日 0 点为时间纪元呢?
其实原因也很简单,是因为当初的操作系统都是32位的,所以时间也是用32位来表示的。所以所能表示的最大值就是2^32-1=2147483647。也就是2147483647/(365 * 24 * 60 * 60)=68.1年。而当时最早的unix操作系统是由AT&T贝尔实验室的三位科学家在1969年开发的,所以当时他们为了让时间尽可能的多利用起来,便用了下一年,即1970年1月1日作为开始。所以目前32位系统的时间最多能支撑到2038年1月19日3时14分7秒。到了这一天的凌晨3点14分8秒,时间表示就会因为溢出变为1901年12月13日20时45分52秒。这样便会出现时间回归的现象,会导致很多问题,所以还是要早点更新到64位操作系统。在64位操作系统中,系统可以表示到292,277,026,596年12月4日15时30分08秒。肯定是够够的了。

到这里java为啥从1970年1月1日开始的问题算是解答了,其他的语言其实也都遵循unix的这套时间系统,所以都是从1970年1月1日开始的。

参考

Unix time - wiki
关于计算机中时间的科普和八卦

文章作者: 毛毛是只猫
文章链接: http://lshaolin.github.io/posts/8a25b5de/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 毛毛是只猫