当前位置:首页 > 公众号精选 > 中兴文档
[导读]大家好,我是中兴文档小蓝人。 前几天,当我在写通信科普文章的时候,突然有一种时空错乱的感觉,恍惚间感觉这个场景十分熟悉,好像在不久之前,同样的电脑,同样的微风拂面,同样的我,做着同样的事情。 就像是梦境与现实重叠,又像是时光河流在倒卷。 各位


大家好,我是中兴文档小蓝人。

前几天,当我在写通信科普文章的时候,突然有一种时空错乱的感觉,恍惚间感觉这个场景十分熟悉,好像在不久之前,同样的电脑,同样的微风拂面,同样的我,做着同样的事情。
就像是梦境与现实重叠,又像是时光河流在倒卷。

各位小伙伴们,你们有遇到过这种情况吗?



平行时空 or 世界Bug


有人说,这是因为有平行时空或者多元空间的存在。

在另外的一个时空中还有一个你,他经历过相同的事情,于是这种熟悉感就会传递给你。


“平行时空”这个猜想,也许很难去证实。

但是彰显这个世界,是一个虚假世界的Bug,却不断的在我们身边出现:

 
为什么会有这么多的证据,表明我们穿越到了1970年1月1日,这个日子有什么特殊的吗?

今天,和小编一起来探索这个神秘的现象吧~



神秘的1970.1.1


首先,遇到问题不要慌,拿出手机,比个耶,拍个照。

然后我们来看一下这个日期:1970.1.1,好像没有什么特别的啊?

但是对于我们日常使用的计算机来说,意义非凡。

如果说宇宙大爆炸代表了宇宙的诞生起点,那么1970.1.1就代表着计算机的诞生时间点。


是不是感觉很奇特,现在我们随处可见的计算机、智能手机,竟然才诞生50年!从来没有一个事物可以发展的如此迅速,并如此剧烈得改变人类的生活。

1969年8月,贝尔实验室程序员肯.汤普逊耗时一个月,开发出了Unix的第一个版本。他估计也想不到,这个B语言开发的全新操作系统,会产生如此深远的影响。

尽管Unix一出世就得到了大家的肯定,但是肯.汤普逊并没有满足,他又和同事丹尼斯里奇一起改进了B语言,开发出C语言,并重写了Unix,新版本于1971年发布。

同年,《Unix Programmer's Manual》出版,将格林威治时间(GMT)1971年1月1日0时0分0秒作为操作系统的起始时间。

后来为方便记忆和计算,起始时间修改为1970年。

现今的计算机系统,或多或少受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多天,时间戳就全用完了。


设计出一个只能使用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年,这不也快到了吗?难道到时候再修改规定?


没错,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多亿年,绝对够用到宇宙的尽头了。




原来真是个Bug


原来如此,那到底为什么有些应用程序中会显示1970.1.1呢?

我们日常使用的各种应用程序,都是构建在操作系统上的。当需要展示时间时,应用程序都要从操作系统中获取时间戳的取值。

所以,1970.1.1的出现,最大的可能就是应用程序在获取时间戳的时候,出现了Bug。


应用程序使用了不恰当的数值、或者无法获取系统时间戳的时候,就只能使用时间戳的默认取值。 而在计算机中,时间戳的默认值通常是0。

时间戳为0 ,表示时间为(GMT)1970年1月1日0时0分0秒。

中国使用北京时间,处于东8区,相应就是早上8点。因此在中国,时间戳出错了,就经常会显示为1970年1月1日08:00。

再遇到1970.1.1的时候,就可以会心一笑:这个应用程序肯定出现Bug,没法获取到正确的时间戳了。



一定要打好时间戳!


应用程序获取时间戳时出现错误,最多就是显示了错误的时间。

如果在时光机中获取到错误的时间戳,那就糟糕了。

未来的时光机,还构造在计算机操作系统上的话,想要穿越时空,就必须以纪元时间为坐标,设置要穿越的时间点,即设置正确的时间戳。


时光机的设计者或者说是程序员们,一定要打好时间戳哦:

  • 用了默认值0,就只能回到1970年1月1日;
  • 用了32位的时间戳,就只能回到1902年11月25日~2038年01月19之间;
  • 用了64位的时间戳,那就随意了,1970年的前后共4000亿年的时空,足够你任意翱翔了!
注意:穿越到1970年1月1日之前时,一定要把时间戳设置为负数。





















那么,各位小伙伴们,你们有没有遇到过Bug呢?


不管是应用程序的Bug,还是现实世界的Bug,欢迎分享哦~























我们是一群平均从业年限5+的通信专业工程师。

关注我们,带你了解通信世界的精彩!


你点的每个在看,我都认真当成了喜欢

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭