当前位置:C++技术网 > 资讯 > 时间数据类型:1 时间的来源、表示、计算机计时和时间校准全面详细分析

时间数据类型:1 时间的来源、表示、计算机计时和时间校准全面详细分析

更新时间:2015-06-26 00:16:01浏览次数:1+次

一直以来的错误理解,你是不是还是理解错了呢?

    或许在学计算机之前,我压根就没想过精确的时间如何得来。初中地理学过,那是根本就没有想法,只是当做一门课了解一下,没有应用的生活。学习了计算机后,了解到计算机可以产生 精确的时钟,非常高的精度哦。感觉计算机好神奇,可以那么精确。然后又了解到计算机计算 时间都是从1970年1月1日00:00:00开始计算的。为什么要从这个时间计算,还一直都没有搞清楚。然后一直以为,精确的世界时间是在世界上一台高精度计算机中计算得来的,认为是计算机一直在存储时间,才让我们有一个高精度的全世界同步的时间可以使用。那么我就一直在担心了,如果这一台服务器突然崩溃了,时间不就混乱了,以后不就不能同步精准的世界时间了。因为在编程要获取网络时间时,总是从时间服务器中获取标准的精准时间,这样也让我更加坚信精准的世界同步时间是存储计算机中的。至于为什么是从1970年1月1日00:00:00开始,以为是那时计算机才有了高精度的时间。

    然而,到今天为止,我已经结束了这一场噩梦,纯粹是虚惊一场。原来我之前的理解,都是错的。如果你也是像我之前那样理解的,请你好好往下阅读,不要再一错再错下去了。





为什么计算机的计时是从1970年1月1日00:00:00开始的呢?

    以前的Unix计算机中存储时间,是以32位来存储的。因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),将1970年作为中间点,向左向右偏移都可以照顾到更早或者更后的时间,因此将1970年1月1日0点作为计算机表示时间的原点,从1970年1月1日开始经过的秒数存储为一个32位整数。以后计算时间就把这个时间(1970年1月1日00:00:00)当做时间的零点。这种高效简洁的时间表示法,就被称为"Unix时间纪元"。





为什么现在的计算机的时间是以64位来存储时间的?

    因为32位的UNIX系统会以32位二进制数字表示时间,它们最多只能表示至协调世界时间2038年1月19日3时14分07秒(二进制:01111111 11111111 11111111 11111111),在下一秒二进制数字会是10000000 00000000 00000000 00000000,这是负数,因此各系统会把时间误解作1901年12月13日20时45分52秒(亦有说回归到1970年)。这时可能会令软件发生问题,导致系统瘫痪。这是著名的Unix 2038 bug(Jason hatchet bug)。

    后来的解决方案就是,计算机表示时间使用了64位来代替32位。在64位系统下,此时间最多可以表示到292,277,026,596年12月4日15时30分08秒。这个时间就可以非常长了,在目前的人类生活时间中,远远够用了。





时间是怎么来的?GMT时间和UTC时间是什么以及两者有什么关系?为什么UTC时间最准确?

    GMT时间,即格林尼治标准时间。以前都是将此时间当做世界标准时间,划分了24个时区,每个时区都以格林尼治标准时间(0时区时间)为准进行校准。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。 地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。现在的世界标准时间称为UTC时间。UTC时间由原子钟提供。因为原子钟的频率都是稳定的,不会像天体运行一样会有不匀速的运转导致时间偏差问题,所以是最准确的时间。

    但是,我们时间的计算由来还是由天体计算得来的,并不是计算机计算得来的。真正基准时间还是要参考GMT时间。 自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。而UTC是基于标准的GMT提供的准确时间。这就是说,UTC时间每个小时会根据GMT时间进行校准。原子钟时用来产生稳定的频率的时间计时,从GMT时间的基础上提供可用的每时每刻的准确时间。所以世界标准时间就采用了UTC时间。计算机只是辅助获得准确时间,存储准确时间供全世界的计算机校对使用的。即使什么时候全世界停电N个小时,再恢复电源,从GMT天文时间得到基准时间,再使用原子钟计时,还是会得到准确的时间。我们一直在误解。计算机只是给我们提供了最准确的时间罢了,计算机不是产生根本时间的源头,最根本的源头在天文里。





为什么时间服务器的时间是最准确的?

    前面说的存储和计时的计算机,是时间服务器中存储的时间。这个服务器专门用来存储和计算精确的时间。它之所以准确,并不是说它的硬件是怎么的牛叉。我们的普通的计算机都可以准确的计时。时间服务器的时间之所以准确,是因为它每个小时会根据格林尼治天文台提供的调时信息进行时间校准。可以时刻保持准确。而我们普通的计算机则不会每隔一小时根据天文台的调时信息进行校准。自然就没有时间服务器的时间准确。并不是因为我们计算机计时不准确,而是我们计算机没有根据天文信息校准罢了。因为最准确的时间是要根据天文学来确定的,而不是计算机来确定的。这个在前面提到过。





计算机本地时间又是怎么回事?

    我们购买的计算机,在出厂时,会根据UTC时间将出厂时间写入到芯片中存储起来。此值是默认的不可修改的值。这个时间芯片会有一个小电池供电,维持时间的计时,不断的累加时间,为本地提供时间。即使我们平时给电脑断电了,时间也能够持续的计时。假如我们将电源拔掉,把主板给这个时间芯片供电的电池也扣掉,那么计算机将不再计时,本地时间存储的位置的值就丢失。下次启动,系统就会读取出厂设置的默认时间为本地时间的起始时间,然后在此基础上累加。存储当前时间的芯片位置是可以修改的,因为要不断的更新时间写入芯片中,才可以提供给计算机使用。如果没有小电池,每次开机都会将本地时间起始设置为出厂时间。本地计算机如果关机状态下,电池电量不足,会导致时钟频率降低,使本地时间也变慢,就变得不准确。但是如果电量充足功能粗,不会有这个问题。如果时间不准确或者出错,可以通过联网时间矫正,从时间服务器获取准确的时间并设置本地计算机的当前时间。



本文只为普及大家(包括我自己)长期以往对时间的错误理解,请多多传播给身边的朋友,才不枉我花大力气研究这么清楚哦。