Javascript中的时间

咱们在编程时,不可避免地会和时间打交道。 好比要完成一次秒杀活动, 就会涉及到时间存取,时间同步和时间差值计算等诸多细节。一个JavsScript的简单例子,当咱们在浏览器控制台输入new Date(), 会获得以下结果:javascript

Sun Oct 30 2016 16:27:04 GMT+0800 (CST)

输出前半部分的含义很容易理解, 它表明的是2016年10月30日 星期日,下午16点27分04秒, 后半部分的GMT,+0800, CST到底表明什么呢, 本着一探究竟的想法, 本文来带你们详细了解下JS中的时间。html

1.时间的表示

在古代, 天文学的一个最重要任务就是度量时间,制定历法。我国古代将一年分为十二月、二十四节气,一天分为十二个时辰,目的就是为了一套高效的时间表示方法用以指导农耕。随着现代社会的发展,时间的表示也须要一套更加科学而精确的方法。java

度量

从计时工具提及

远古时代,人类是根据太阳与地球的角度变化来做息的, 人们都是日出而做, 日落而息, 人类一直遵循着这种延续下来的做息规律。这时的人们对于时间没有什么特别的概念,也不用计时工具。编程

在中国周代,人们将一天分为12个时辰:子、丑、寅、卯、辰、巳、午、未、申、酉、戊、亥,分别对应夜半、鸡鸣、平旦、日出、食时、隅中、日中、日昳、晡时、日入、黄昏、人定。用来指导人们一天的生活规律。这时,咱们用沙漏、日晷来记录大体的时间,能够区别出来的最短期是1个时辰(2h)。浏览器

后来,工业革命将人类带入了工业时代,此时人们对于时间有了更精细的划分,一天被分为12个小时, 每小时60分, 每分60秒。为了更高效地生产,咱们用钟表来记录时间,咱们对于时间的利用也达到了秒级。服务器

而如今,咱们的计时工具已经升级成了冷原子钟。 好比我国的北斗导航卫星系统使用的就是原子钟来记录时间,其计时精度已经达到纳秒级别(1ns=10^-9s)。咱们已将空间和时间结合到了一块儿,能够经过时间来推算空间,在空间中转换时间。工具

ps: 曾经在园区听过中科院博导徐颖关于北斗的演讲, 不由为人类的创造力和中国的强大国力所折服。设计

随着人类文明的进步,计时工具也在不断地发展。借助这些工具,人类对于时间的划分愈来愈细, 对于时间资源的利用率也愈来愈高。code

时间单位

咱们用时间单位来表达特定的时间间隔,经常使用的时间单位如: 世纪、年、季度、月、日、小时、分、 秒、 毫秒、微妙、纳秒等。当前人类能够测量的最短的时间单位是阿秒(attosecond),为中性π介子的寿命, 至关于10^-18 秒。server

能够说,人们时间的细分过程和标准制定过程,实际上是人类探索时间,利用时间的过程。 咱们对于时间单位的认知,能够从侧面反映咱们对自身所处的时空的认知。时间单位也折射出人类科学文明的发展历程。

时刻

咱们平时常说,如今9点钟了, 其实指的就是时刻。咱们要表达的是当前已经达到9点这个时间点了。它是既没有大小也没有方向的,它只表达一个具体的时间点。
就比如咱们用尺子来衡量长度, 咱们也在用一把标记着秒,小时的“尺子”来衡量时间。而时刻,只是咱们均可理解的尺子上的某一个刻度。惟一的差异是, 空间中的长度一般是不变的, 而时间永远是在是不可逆地增长的。

2. 时间标准化

首先,咱们应认识到,在整个宇宙中, 时间是统一的。 从宇宙的诞生到如今, 老是能够用一个特定的时间间隔值来表示咱们所经历的时间,它是一个固定的值。 那么咱们不由会问为何会说咱们这儿是早上9点,而英国那边确是凌晨1点呢,这不是两个不一样的时间吗?这就要引出咱们下面将提到的时间标准问题。

在之前,人类的活动范围相对狭小,基本不会注意到时区对于人类做息的影响。咱们彻底想象不到, 当咱们在阳光下辛勤劳做的时候, 地球另外一面的人们早已进入梦乡。

可是工业革命以后,人类的生产和交通工具不断进步,全球化协做成为不可阻挡的潮流。 此时人们已经意识到了地球在不停地自西向东自转, 自转一周则为一日。而不一样经度的地区日出的时间是有前后差别的。好比中国北京仍是正午的时候,大洋彼岸的美国纽约正好是深夜。早上8点咱们一个电话打过去, 说美国的XXX, 该上班了, 对方必定是一脸的迷(meng)茫(bi), 我这准备洗洗睡呢。

正是人们认识到地球自转的天文规律,才须要制定一套全球统一的时间标准,这样,咱们根据本地时间就能够推算出地球任何地区的当地时间(日出日落时间),以方便进行更好的协做。

格林尼治平时(Greenwich Mean Time, GMT)

格林尼治是位于英国伦敦郊区的皇家格里尼治天文台, 咱们常常说的格林尼治时间指的就是以此地的时间为标准时间制定的一套时间计量系统。

为了准确地表示各地时间,1884年,国际经度会议决定将经过英国格林尼治天文埃里中星仪的经线定为计算经度的起算经线,称为本初子午线。以本初子午线的平子夜起算的平太阳时,分别向东、西计量增减12时,做为统一的时间标准,称为格林尼治平时。这也就是GMT时间的由来,它是根据地球的自转所定义的一套时间标准,其对于平常生活, 天文导航和宇宙飞行等人类活动具备重要做用。

GMT的制定同时也产生了时区的概念。咱们在听关于国外的新闻报道的时候,常常会听到于当地时间XX时XX分,本地时间yy时yy分发生了什么大事,而后是balabala。 这其实就是在时间的表示上避免位于不一样时区的人对于时间理解的差别。

时区(Time Zone), 设定了一个区域的标准时间。 理论上, 以被15整除的子午线为中心, 向东西各延伸7.5经度,划分为一个时区。实际上,因为各个国家的版图不规则, 一般会跨越多个时区, 因此国家内部还会规定整个行政区域内的一个实际时区,称为法定时区。好比中国, 从西到东横跨东5、东6、东7、东八和东九五个时区, 中华人民共和国成立之后,全国统一采用首都北京所在的东八时区的区时做为标准时间,称为北京时间。

协调世界时(Coordinated Universal Time, UTC)

UTC一般被误认为是GMT, 其实二者的表示方法彻底不一样。

UTC的由来

人类观测到地球自转的缓慢降低,地球自转一周耗时通过一段时间后会多于现行的24小时,所以GMT时间已再也不适合做为标准时间使用。如今的标准时间是由原子钟报时的协调世界时,这是由国际计量局和国际地球自转服务(IERS)维护的时间标度,是各标准频率和时间信号协协调播发基准。

那为何又要搞个UTC呢,太乱了吧? 其实谁也不想这么麻烦, 这是地球本身“转”出来的。

咱们常识性认为地球自转一周是24小时,而因为地球自转速度变慢,在通过了24h以后,地球可能尚未成一周的运转, 为了保证24h和地球完整的一周相匹配,就必须让钟表上的时间等待地球自转一周完成,这就是协调世界时中“协调”二字的含义。UTC时间相较于国际原子钟时间(International Atomic Time, TAI)实际是要慢的。

注:秒是基本的时间国际单位,国际上如今标准的1秒为:铯133原子基态的两个超精细能级间跃迁对应的辐射的9,192,631,770个周期的持续时间

说白了,TAI时间是基于原子规律定义的时间,这个时间长时间不会变化。UTC是为了符合地球自转周期所制定的时间, UTC会让全球的钟表都停下来,补上地球自转变慢的差值, 而矫正和同步机构就是IERS。全球全部国家根据UTC时间和各自国家所在的时区肯定当地时间,以此来保证全球时间的低偏差同步。

闰秒

UTC以加入闰秒(leap-secons)的方式对时间进行修正,以消除地球自转变慢的影响。闰秒是为了平衡因地球自转变慢所引发的和原子钟的时间差而特地设置的。若是不加入闰秒,可能过几万年以后,中午的12点会变成凌晨0点; 再过个几百万年,日历上的冬天会变成了夏天了,那么整个生产生活就会乱套了。

闰秒的引入时机是每一年的6月和12月月末, 视UTC-TAI的演变差值而定,而且每隔六个月会公布是否须要加入闰秒(这就是IERS干的活儿)。

上次闰秒的引入时间是UTC 2015-6-30 23:59:60 而下一次的闰秒引入会在:

2016-12-31 23:59:59
2016-12-31 23:59:60
2017-01-01 00:00:00

从2015-07-01 00:00:00 UTC 到 2017-01-01 00:00:00 UTC 时间差别是: UTC - TAI = -36s. 也就是说,咱们的UTC时间标准相较于真正的原子钟时间,人为地慢了36秒。

PS1: 是否是感受本身赚到了, 多活了36s呢!
PS2: 人类当前所用的时间大多都已是UTC时间了, 可是不少时候还保留着GMT的时区划分规则,因此不少地方显示的仍是GMT时间。

北京时间(China Standard Time, CST)

再来讲一下我国的时间基准, 北京时间不是在北京肯定的,而是由位于中国版图几何中心位置陕西临潼和陕西蒲城的中国科学院国家授时中心(国家授时台)的9台铯原子钟(铯钟)和2台氢原子钟组经过精密比对和计算实现,并经过卫星与世界各国授时部门进行实时比对肯定的。国内的设备能够经过国家授时中心提供的NTP(Network Time Protocol)服务器和本地时间进行同步。具体使用能够参看此处

在Mac上, 能够经过以下命令和制定的NTP服务器进行校时:

➜ ~ sudo ntpdate -u cn.pool.ntp.org
1 Nov 03:20:08 ntpdate[84376]: adjust time server 59.46.44.253 offset 0.014804 sec
➜ ~

3. 小结

再回到文章最开始所提到的, new Date()在输出数据, 全部的内容就清晰了:

  • GMT, 表明的格林尼治平时,但此处的GMT所表示的意思是:时间使用的时区是GMT标准,采用的是UTC时间

  • +0800 表明的是当前时间和标准时间的时差, 精确到分。+0800, 表示当前时间早于UTC时间8小时整

  • CST 指的是北京时间

done!

4. 后记

一门程序设计语言中有不少细节, 每每蕴含着极大的智慧。以本文提到的时间为例, 几个简单的单词, 其中蕴含了人类近几百年的科技文明发展成果,也反映了人类对于时间的尊重和敬畏,每一处都值得细细品味。

原文:http://lianmin.me/2016/10/30/...

参考文献

[1] 闰秒(leap seconds): http://tycho.usno.navy.mil/le...
https://hpiers.obspm.fr/iers/...
[2] 日期和时间表示法(国标 GB/T 7408-2005) http://www.cmaph.org/attachme...
[3] 24小时制: https://zh.wikipedia.org/wiki...
[4]时间: https://zh.wikipedia.org/wiki...

相关文章
相关标签/搜索