文档章节

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

X
 XueYongWei
发布于 2015/05/02 11:51
字数 797
阅读 4
收藏 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点。

我想以上问题如果作为面试题,也能难倒一批人了.

© 著作权归作者所有

X
粉丝 1
博文 25
码字总数 26713
作品 0
海淀
私信 提问
java的System.currentTimeMillis()和System.nanoTime...

纳秒   ns(nanosecond):纳秒,时间单位。一秒的10亿分之一,即等于10的负9次方秒。常用作内存读写速度的单位,其前面数字越小则表示速度越快。   1纳秒=1000皮秒    1纳秒 =0.001...

文星
2012/09/27
13.1K
0
new Date() 方法到底是获取什么时间

1、问题 java 中,new Date() 方法,获取的时间,究竟与当前的系统时间有什么关联?简单的时刻对应关系吗? 2、测试环境 版本:jdk1.8.0_131 主方法: 3、更新时间前 如上图所示,控制台输出的...

开源小菜鸟2333
2017/11/08
361
0
Java 8中时间 API 初探

Java 8目前已经开始进入大众的视线,其中笔者在写本文之前,留意到其中Java 8预览版中将会出现新的关于日期和时间的API(遵守JSR 310规范)。在本系列文章中,将对这些新的API进行举例说明。...

苗哥
2013/07/21
1K
3
PerfMa给OpenJDK社区提交的第一个Patch

概述 前两天给openjdk gc-dev的email list提交了一个问题,主要是针对Full GC之后,GC日志里Metaspace的大小在GC前后都一直不变的问题,我在邮件里大概也提了下如何修复该问题,以及猜测了下...

你假笨
2018/09/25
0
0
Java 8中的时间api初探1

本文是本人翻译作品,原文发表在:http://developer.51cto.com/art/201307/403828.htm Java 8目前已经开始进入大众的视线,其中笔者在写本文之前,留意到其中Java 8预览版中将会出现新的关于日...

jackyrong
2013/07/24
224
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Security 自定义登录认证(二)

一、前言 本篇文章将讲述Spring Security自定义登录认证校验用户名、密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Security...

郑清
25分钟前
2
0
php yield关键字以及协程的实现

php的yield是在php5.5版本就出来了,而在初级php界却很少有人提起,我就说说个人对php yield的理解 Iterator接口 在php中,除了数组,对象可以被foreach遍历之外,还有另外一种特殊对象,也就是继承...

冻结not
38分钟前
3
0
servlet请求和响应的过程

本文转载于:专业的前端网站➥servlet请求和响应的过程 1.加载 Servlet类被加载到Java虚拟机中,并且实例化。在这个过程中,web容器(例如tomcat)会调用Servlet类的公开无参构造函数,产生一...

前端老手
39分钟前
3
0
golang 1.13 errors 包来了,不用写“err 气功波”代码

引 这篇是对 errors 包 的姿势挖掘 气功波错误代码 从 http.Get()返回的错误 判断 syscall.ECONNREFUSED 错误.以前要对 go 标准库 error 结构有点熟悉,才能写出下面的代码 func CmdErr(err ...

guonaihong
42分钟前
28
0
喜玛拉雅已听书单

时间倒序排 书名 作者 状态 唐砖 孑与2 进行中 死灵之书(克苏鲁神话合集) 阿卜杜拉·阿尔哈萨德 进行中 赡养人类 刘慈欣 完结 赡养上帝 刘慈欣 完结 中国太阳 刘慈欣 完结 中国太阳 刘慈欣...

Alex_Java
44分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部