关于计算机中时间的科普和八卦

作者:Jack47
转载请保留作者和原文出处

PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源

在了解计算机中的时间之前,来看看现实生活中的时间标准:协调世界时

协调世界时(Coordinated Universal Time)

协调世界时(UTC),又称世界标准时间或世界协调时间,简称UTC,是用来在全球范围内同步时间的方法,是最主要的世界时间标准。

UTC是通过非常精确的原子钟来维护,它以国际原子时秒长为基础。为了抵消地球自转变慢的影响,需要不规则的加入闰秒(比如2016年就加入了一秒)。说人话就是人为规定的一天与地球自传产生的差异(地球自转是缓慢变化的,并不是精确的24小时)。闰年也是这么来的,为了弥补人为规定的纪年与地球公转产生的差异。

格林尼治时间(Greenwich Mean Time)和UTC是相等的,GMT是旧式的方法。协调世界时是最接近格林威治标准时间(GMT)的几个替代时间系统之一。在分布式系统中,或者在实时处理的系统中,时间的同步是非常重要的,之前看到一个新闻,黑客通过干扰金融交易中心的时钟,来达到进行违法交易的目的。

原子钟的发明之前,人们通过天文观测来矫正时间,而原子钟提供了一种更稳定且更方便的守时机制。时间的协调首先是应用在无线电广播中,将时间的步长和频率的变化得到了协调。

Unix时间

Unix时间(Unix Time)),也叫做POSIX时间或纪元时间(epoch time),是用来记录时间的流逝,定义为从UTC时间1970年一月一日00:00开始流逝的秒数,不考虑闰秒。从定义可以看到它只代表了从Unix纪元开始流逝的秒数,所以你身处地球上何处,这个时间都是一样的。Unix系统中计算机内部的时间都是使用Unix时间的。而给用户看时,就需要转换成日期和时间的这种对人友好的形式。

查看当前Unix时间

在类Unix系统上查看当前的Unix时间:

$ date +%s
1490451854

一般Unix时间都是精确到秒,但也有些地方Unix时间是精确到毫秒的

Unix纪元(Epoch time)

纪元(Epoch)是指具有历史意义的某一刻,其实就是一个参考点。比如在朝鲜,人们使用1912年作为日历的纪元,对他们而言,日历的起点是1912年,因为这一年是Kim II-Sung的诞辰。Unix纪元是Unix或类Unix系统,一些C/C++,Java等编程语言使用的纪元,从1970年一月一日00:00 开始。而其他的操作系统或者编程语言,使用的就是不一样的纪元起始日期了,比如 Microsoft C/C++ 7.0 使用的是 1899年十二月31号。从Unix纪元(1970-01-01-00:00:00:就是Unix时间的零点,以后的时间是正的,而Unix纪元之前的时间就是负值。

为什么Unix系统中纪元时间(epoch time)是1970年?

这个问题得去问Unix之父:Ken ThompsonDennis Ritchie了,是他们选择这个时间作为Unix系统的纪元时间的。

第一版的Unix程序员手册是1971年11月份出版的,上面定义Unix时间是“从1971年一月一日00:00:00开始,单位是一秒的六十分之一“。这意味在Unix时间的最早版本中,时间计数器以60Hz的频率(芯片的振荡器频率)递增,每隔1/60秒,计数器就加一。当时使用的整数计数器是32位的,这样Unix时间能够表示的范围就非常受限了,2^32/60/3600/24/30/12 大约是 2.3年。所以后来经过多次更改,频率变成了1Hz,纪元时间改为了1970年一月一日00:00:00。

有一种说法是Unix操作系统诞生于1970年,但实际上并不是的,在1969年左右,Unix的概念就已经诞生了,Unix的最早版本已经诞生了。Wired网站上的一篇文章写道

Ritchie说这个时间其实是随意选择的,因为需要一个统一的日期来作为时间的起点,而1970年的元旦,看起来是最方便的。

时期和时间的国际标准表示方法

国际标准化组织规定了日期和时间的表示方法ISO 8601,用来规定日期和时间相关的数据交换时的格式。如果时间是UTC时间,那么末尾会带个大些的Z。比如写下本博客时,符合ISO 8601标准的UTC时间为 2017-03-25T14:35Z。因为北京的时区为东八区,比UTC时间要早8个小时,所以此时北京的当地时间(local time)为2017-03-25T22:35。 而上文提到的Unix纪元,用ISO 8601来表示,是UTC时间:1970-01-01T00:00:00Z

可以把精确度为秒的Unix时间转化到localTime

date -d@timestamp 

有趣的事件

2000年问题

由于Unix时间戳是32位的,所以最大值是 0x7FFF:FFFF, 即2^31 - 1 = 2147483647,即2038年1月19号,此时会发生什么呢?如果时间戳不迁移到64位系统,那么此时时间戳会归零,需要所有的程序去适应这个状况,就跟1999年最后一天发生的事情一样:2千年问题
可以订购一件这样拉风的体恤:
The end

iPhone/iPad变砖

如果把苹果iPhone、iPad等设备的系统时间设置为1970年1月1日,随后重启设备,它会直接变砖。苹果最后采取的修复策略是在随后的固件更新中将时间禁止调整到2000年以前。


如果您看了本篇博客,觉得对您有所收获,请点击右下角的“推荐”,让更多人看到!

资助Jack47写作,打赏一个鸡蛋灌饼吧
pay_weixin
微信打赏

posted on 2017-03-27 01:52 Jack47 阅读(...) 评论(...) 编辑 收藏

导航

统计