Java的时间为何从1970年1月1日开始

上周有同事问到几个和时间相关的问题,非常有意思,之前也没怎么想过,不知道大家是否想过这几个问题

  • 在mac下发现System.nanoTime()在JDK7和JDK8下输出的值怎么完全不一样
  • System.nanoTime()的值很奇怪,究竟是怎么算出来的
  • System.currentTimeMillis()为何不是System.nanoTime()的1000倍

这几个问题欢迎大家在这篇文章之后发表下自己的看法,如果大家都知道我就不准备写System.currentTimeMillis()System.nanoTime()的具体实现的文章啦

不过今天要简单聊下另外一个有意思的问题,也是刚刚突然想到的问题,为何我们执行System.out.println(new Date(0));的时候,输出的是Thu Jan 01 08:00:00 CST 1970,为何是1970年1月1日,也许大家对1970年1月1日并不陌生,但是从来没有想过这个问题吧,我也其实也没详细想过,于是也查资料,看代码,看到分析结果还挺有意思的,于是打算简单写出来给没了解过的朋友涨涨姿势,网上这方便的资料还是不少的,需要详细解释的,自己查查,哈哈

最初操作系统是32位的,当然现在有不少已经转到64位上了,那个时候的时间也是用32位来表示的,那么能表示的最大值是2^32-1=2147483647,而这个值算下来2147483647/(365 * 24 * 60 * 60)=68.1年,而当时unix操作系统最早由KenThompsonDennis RitchieDouglas McIlroy于1969年在AT&T的贝尔实验室开发,为了让这个32位能全部利用起来,就用来存个相对1970年1月1日的时间了(那个时候unix的计算机估计才慢慢生产),这样一来,当时间达到68.1年的时候,对应的时间是2038年1月19日3时14分7秒,到这天的凌晨3时14分8秒就会出现溢出情况了,时间会变成1901年12月13日20时45分52秒,或许大家听过以前的千年虫问题吧,如果2038年大家还在32位上玩,那估计会很糟糕了,所以大家尽快到64位上来玩吧

Java因为也遵循了unix的这套时间标准,所以我们能看到上面的现象。

猜你喜欢

转载自blog.csdn.net/zl1zl2zl3/article/details/84563817