今天在看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).java
定义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点。 我想以上问题若是做为面试题,也能难倒一批人了.