![](https://picture.iczhiku.com/weixin/weixin15940358664831.png)
大家晚上好,前几天,当小编在写通信科普文章的时候,突然有一种时空错乱的感觉,恍惚间感觉这个场景十分熟悉,好像在不久之前,同样的电脑,同样的微风拂面,同样的我,做着同样的事情。
在另外的一个时空中还有一个你,他经历过相同的事情,于是这种熟悉感就会传递给你。![](https://picture.iczhiku.com/weixin/weixin15940358664835.png)
但是彰显这个世界,是一个虚假世界的Bug,却不断的在我们身边出现:![](https://picture.iczhiku.com/weixin/weixin15940358664836.png)
为什么会有这么多的证据,表明我们穿越到了1970年1月1日,这个日子有什么特殊的吗?![](https://picture.iczhiku.com/weixin/weixin15940358664839.png)
然后我们来看一下这个日期:1970.1.1,好像没有什么特别的啊?如果说宇宙大爆炸代表了宇宙的诞生起点,那么1970.1.1就代表着计算机的诞生时间点。![](https://picture.iczhiku.com/weixin/weixin159403586648310.png)
是不是感觉很奇特,现在我们随处可见的计算机、智能手机,竟然才诞生50年!从来没有一个事物可以发展的如此迅速,并如此剧烈得改变人类的生活。1969年8月,贝尔实验室程序员肯.汤普逊耗时一个月,开发出了Unix的第一个版本。他估计也想不到,这个B语言开发的全新操作系统,会产生如此深远的影响。尽管Unix一出世就得到了大家的肯定,但是肯.汤普逊并没有满足,他又和同事丹尼斯里奇一起改进了B语言,开发出C语言,并重写了Unix,新版本于1971年发布。同年,《Unix Programmer's Manual》出版,将格林威治时间(GMT)1971年1月1日0时0分0秒作为操作系统的起始时间。现今的计算机系统,或多或少受Unix的影响,延续Unix的计时方式。格林威治时间(GMT)1970年1月1日0时0分0秒从此成为Unix世界的起始时间,甚至超越Unix成为整个计算机世界的起始时间。Unix中常常使用一个数字记录时间,即Unix纪元时间(格林威治时间1970年1月1日00:00:00)到当前时间的秒数。(根据系统的精度,时间单位有时为毫秒,有时为纳秒)。大于0表示在起始时间之后,小于0表示在起始时间之前。这个数字有时是浮点类型、有时是整数类型,统一称为时间戳(Timestamp)。一开始的Unix都是32位的,所以时间戳的取值范围为-2147483648(231) ~ 2147483647(231-1),不过一般我们认为计算机不会在1970年前使用,所以使用的是时间戳的正整数,即最大值为2147483647(231-1)。最初Unix的规定是:时间戳每变化一次,就表示时间经过了1/60秒。比如时间戳取值为3600,表示以格林威治时间1970年1月1日00:00:00为起点,经过了3600x1/60秒= 60秒,那现在的时间就是1970年01月01日00时01分00秒。人们很快就发现了问题:一个时间戳代表1/60秒的话,2147483647x(1/60秒)/(24小时x60分钟x60秒)=414.3天,也就是说只需要400多天,时间戳就全用完了。![](https://picture.iczhiku.com/weixin/weixin159403586648313.png)
设计出一个只能使用400多天的操作系统,显然不是大家的愿望。于是Unix修改了规定:时间戳每变化一次,就表示时间经过了1秒。这个规定延续到现在,还在使用。比如时间戳取值为3600,表示以格林威治时间1970年1月1日00:00:00为起点,经过了3600秒,那现在的时间就是1970年01月01日01时00分00秒。从1/60秒扩大到1秒,操作系统的时间也从400多天扩展到了68年,虽然时间上仍然不多,但对于当时的人们来说,已经是足够使用的了。看着这里,你是不是不禁要问,1970+68岂不是2038年,这不也快到了吗?难道到时候再修改规定?![](https://picture.iczhiku.com/weixin/weixin159403586648314.png)
没错,32位时间戳能代表的最长时间是68年,到2038年01月19日03时14分07秒,便会到达最大时间。过了这个时间点,所有32位操作系统时间便会变为 10000000 00000000 00000000 00000000,也就是1901年12月13日20时45分52秒,会出现时间回归的现象,很多软件便会运行异常了。当初Unix使用的是32位,导致时间戳的取值有限。而现在大部分的计算机,都是64位的了。时间戳的取值范围扩大为-9223372036854775808(263) ~ 9223372036854775807(263-1)。换算成时间的话,64位的时间戳,可以覆盖了1970年前2000多亿年,后2000多亿年,绝对够用到宇宙的尽头了。![](https://picture.iczhiku.com/weixin/weixin159403586648315.png)
原来如此,那到底为什么有些应用程序中会显示1970.1.1呢?我们日常使用的各种应用程序,都是构建在操作系统上的。当需要展示时间时,应用程序都要从操作系统中获取时间戳的取值。所以,1970.1.1的出现,最大的可能就是应用程序在获取时间戳的时候,出现了Bug。![](https://picture.iczhiku.com/weixin/weixin159403586648318.png)
应用程序使用了不恰当的数值、或者无法获取系统时间戳的时候,就只能使用时间戳的默认取值。而在计算机中,时间戳的默认值通常是0。时间戳为0,表示时间为(GMT)1970年1月1日0时0分0秒。中国使用北京时间,处于东8区,相应就是早上8点。因此在中国,时间戳出错了,就经常会显示为1970年1月1日08:00。再遇到1970.1.1的时候,就可以会心一笑:这个应用程序肯定出现Bug,没法获取到正确的时间戳了。应用程序获取时间戳时出现错误,最多就是显示了错误的时间。未来的时光机,还构造在计算机操作系统上的话,想要穿越时空,就必须以纪元时间为坐标,设置要穿越的时间点,即设置正确的时间戳。![](https://picture.iczhiku.com/weixin/weixin159403586648321.png)
时光机的设计者或者说是程序员们,一定要打好时间戳哦:- 用了32位的时间戳,就只能回到1902年11月25日~2038年01月19之间;
- 用了64位的时间戳,那就随意了,1970年的前后共4000亿年的时空,足够你任意翱翔了!
注意:穿越到1970年1月1日之前时,一定要把时间戳设置为负数。
那么,各位小伙伴们,你们有没有遇到过Bug呢?
不管是应用程序的Bug,还是现实世界的Bug,欢迎分享哦~
来源:中兴文档
编辑:小烩饼
![](https://picture.iczhiku.com/weixin/weixin159403586648323.png)