微信号:lovestblog

介绍:码农的一片净土,在这里围绕JVM为你分享一些自己的学习经历,碰到的经典性能案例及调优经验,有新的文章一般都会同步到个人博客www.lovestblog.cn(如果觉得有收获,那就置顶公众号吧)

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

2016-11-28 18:35 寒泉子

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

  • 在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的这套时间标准,所以我们能看到上面的现象

另外发现公众号里的消息,如果隔了两天才回复是不能再回复的,所以大家最好不要在消息框里提问题,很重要的问题可以发到我的邮箱里,有时间我会上去看下回答下


 
猜您喜欢 给女朋友的 iOS 开发教程 iOS With Girlfriend 1 Design 这就是你想要的?那些美不胜收的电影官网 浏览器的渲染原理简介 flash和策略文件 提供给Android和iOS开发人员的UWP移植向导