Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6945048
  • 博文数量: 701
  • 博客积分: 10821
  • 博客等级: 上将
  • 技术积分: 12021
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-02 10:41
个人简介

中科院架构师,专注企业数字化各个方面,MES/ERP/CRM/OA、物联网、传感器、大数据、ML、AI、云计算openstack、Linux、SpringCloud。

文章分类

全部博文(701)

分类: Oracle

2010-11-17 19:17:11

一直知道java,Oracle的计算时间从1970年1月1日开始,但没有深究过为什么。汗!
看了下面的文章,很受益。

转 java为什么计算时间从1970年1月1日开始
2010-07-26 11:45
今天在看Python  API时,看到time模块:

The
epoch is the point where the time starts. On January 1st of that year, at 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).


定义time197011日开始,忽然想到在JAVA里,Oracle数据库时间也是从1970
11日开始计算。比如java类代码

Date
date new Date(0);
System.out.println(date);

打印出来的结果:

Thu Jan 01 08:00:00 CST 1970

也是197011日,实际上时分秒是000(这里打印出来是8点,稍后会作解释)

为什么这个时间会定义在197011日这个时候呢?

于是开始了Google,中文网页根本找不到答案。 于是试着搜索英文关键字,Sun java论坛总算找到准确的帖子:



其中有一个回复:


suspect that Java was born and raised on UNIX system.
UNIX considers the epoch (when did time begin) to be midnight, January 1, 1970.

是说java起源于UNIX系统,而UNIX认为1970110点是时间纪元.

但这依然没很好的解释"为什么",出于好奇,继续Google,总算找到了答案:



这里的解释是:

最初计算机操作系统是32位,而时间也是用32位表示。

System.out.println(Integer.MAX_VALUE);
2147483647



IntegerJAVA内用32位表 示,因此32位能表示的最大值是2147483647。 另外1365天的总秒数是31536000,

2147483647/31536000 68.1

也就是说32位能表示的最长时间是68年,而实际上到20380119031407
秒,便会到达最大时间,过了这个时间点,所 有32位操作系统时间便会变 为
10000000 00000000 00000000 00000000

也就是19011213204552秒,这样便会出现时间回归的现象,很多软件便会运 行异常了。

到这里,我想问题的答案已经出来了:

因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算
机产生的年代和应用的时限综合取了
197011日作为UNIX TIME的纪元时间(开始
时间
),而java自然也遵循了这一约束。

至于时间回归的现象相信随着64为操作系统 的产生逐渐得到解决,因为用64位操作
系统可以表示到
292,277,026,596124153008秒,相信我们的N代子孙,哪
怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后了。

最后一个问题:上面System.out.println(new Date(0)),打印出来的时间是8点而非0点,
原因是存在系统时间和本地时间的问题,其实系统时间依然是0点,只不过我的电脑时区
设置为东8区,故打印的结果是8点。

我想以上问题如果作为面试题,也能难倒一批人了.
阅读(2795) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~