引言
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日开始的。