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

本文探讨了为何多个编程语言及操作系统将时间起点设定为1970年1月1日,并解释了这与早期计算机32位系统限制的关系。
今天在看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论坛总算找到准确的帖子:

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认为1970110点是时间纪元.

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

http://en.wikipedia.org/wiki/Unix_time

这里的解释是:

最初计算机操作系统是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点。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值