为什么编程语言以及数据库要从1970年1月1日开始计算时

今天在看 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).


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

其中有一个回复 :


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 认为 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值