java为什么计算时间从1970年1月1日开始

Java 专栏收录该内容
32 篇文章 0 订阅

今天在看Python  API 时,看到 time 模块 :

The epoch is the point where the time starts. On January 1st of that year, at 0 hours,the “time since the epoch” is zero. For Unix, the epoch is 1970. To find out what the epoch is, look at gmtime(0).



定义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点。

我想以上问题如果作为面试题,也能难倒一批人了.
  • 0
    点赞
  • 1
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值