编程的时间纪元(1970.01.01 00:00:00)

时间很神秘,人们习惯性的给它设置一个起点。比如现在的公元纪年,就是把耶稣的诞辰当成元年。然后顺着这个元年往后可以无限延伸,往前也可以无限延伸。这个纪元只是成了一个参照点。在编程世界里也有一个时间纪元,不过有所不一样。

编程时间纪元(1970.01.01 00:00:00)

在计算机的世界里,表示时间的单位有点捉襟见肘。
早期Unix等机器都是32位,那么表示的时间长度有限,只能从1901年到2038年,那么过了2038年时间就会回到1901年。这样就有问题。不过这个最后随着64位机器的诞生就解决了。因为时间可以表示
2^63/86400 ~ 1E14(天) ~ 2.92E11(年)
大约是2920亿年。 足够了。
也就是说,编程里的时间只是一个线段,有始有终。这是它独特的时间特点。编程的时间也是为了记录现实时间,明显的在32位时代,跨度太小,不够用。64位时代扩大了跨度,适用性也就够了。无论怎样,编程的时间里必须有一个时间的起点和终点。32位时代,为了方便,约定俗成的把时间的起点设成了1970.01.01 00:00:00。到了64位时代,大家还是都遵循这一点,这就是编程届时间纪元的开始。

因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),而java自然也遵循了这一约束。至于时间回归的现象相信随着64为操作系统的产生逐渐得到解决,因为用64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒,相信我们的N代子孙,哪怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后了。

Linux程式设计-29.时间处理

UNIX及Linux的时间系统是由「新纪元时间」Epoch开始计算起,单位为秒,Epoch则是指定为1970年一月一日凌晨零点零分零秒,格林威治时间。

目前大部份的UNIX系统都是用32位元来记录时间,正值表示为1970以後,负值则表示1970年以前。我们可以很简单地计算出其时间领域:
2^31/86400(s) = 24855.13481(天) ~ 68.0958(年)
1970+68.0958 = 2038.0958
1970-68.0958 = 1901.9042
时间领域为[1901.9042,2038.0958]。
准确的时间为2038年一月十八日星期一晚上十点十四分七秒。那一刻,时间将会转为负数,变成1901年十二月十三日黑色星期五下午三点四十五分五十二秒,然後Jason就会跑出来用斧头砸掉您的电脑。
这就是所谓的UNIX 2038 BUG,或者您也可戏称为Jason hatchet bug。在大部份的UNIX上,并没有所谓Y2K问题,不过都有2038年问题。

在一些64位元的平台上,例如Digital Alpha、SGI、Sparc等等,则用64位元来表示时间。
2^63/86400 ~ 1E14(天) ~ 2.92E11(年) 。大约是2920亿年。
因此,使用64位元的电脑可能会有 Armageddon bug 的问题。届时位於猎户座旋臂的太阳,已经是黑矮星或暗黑物质,猎户座旋臂大概也已经被重力波震断,银河系大概则已经变成小型似星体了。

虽然许多人认为UNIX的2038年问题会随着科技的进步,而将电脑逐步汰换成64位元电脑,因此无须担心。但我个人相信,在2038年,依然会有许多状况出现。因为,就事实而言,目前许多UNIX系统都有足够的能力服役到2038年而毫无问题。因此,如果有意添购电脑主机,而且有预期会使用到那个时候,最好是选购64位元电脑,确认只有世界末日问题(除非您想要把资料流传给下一个宇宙,那就要另当别论了)。

深入分析Linux内核源码

以上我们了解了RTC(实时时钟、硬件时钟)和OS时钟(系统时钟、软时钟)。下面我们具体描述OS时钟。OS时钟是由可编程定时/计数器产生的输出脉冲触发中断而产生的。输出脉冲的周期叫做一个“时钟滴答”。计算机中的时间是以时钟滴答为单位的,每一次时钟滴答,系统时间就会加1。操作系统根据当前时钟滴答的数目就可以得到以秒或毫秒等为单位的其他时间格式。

定义“时间基准”的目的是为了简化计算,这样计算机中的时间只要表示为从这个时间基准开始的时钟滴答数就可以了。

(参考:https://www.cnblogs.com/xingzoudeyishu/p/5400927.html

你可能感兴趣的:(编程的时间纪元(1970.01.01 00:00:00))