从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • 计算机历史

  • 数字电路

  • 计算机组成原理

  • 汇编语言

  • C语言

  • 数据结构

  • 操作系统

  • Linux

  • 计算机网络

  • Git

  • 数据库

  • 计算机小知识

    • 简单聊聊计算机之中的时间
      • 昼夜的由来
      • 时区的由来
      • 四季的由来
      • 自转和公转的来历
      • 闰年的来历
      • 世界时:第一套时间标准
      • 世界时的缺点:不精确
      • 原子钟:完全稳定的一秒
      • 世界标准时间:加个闰秒
      • 计算机如何同步时间:授时
      • 烦人的闰秒
      • 总结
      • 附注
    • 简单聊聊字符编码
    • ASCII字符表和说明
    • ASCII的SOH的用处
    • 回车和换行
    • 汉字是怎么编码的
    • 简单聊聊Unicode
    • 手持两把锟斤拷,口中疾呼烫烫烫
    • 数据库与编码
    • 编程语言与字符编码
    • URL编码
    • Base64编码
    • 字符编码小结
    • literacy
  • 编译原理

  • 名人堂

  • 计算机基础
  • 计算机小知识
2022-12-07
目录

简单聊聊计算机之中的时间

# 简单聊聊计算机之中的时间

在工作中,程序员难免和时间打交道。那么时间背后的原理是什么呢?为什么会有闰年、闰秒呢?

‍

# 昼夜的由来

我们先简单聊聊昼夜是怎么来的。

如果你高中时学过地理,那么应该会知道为什么有昼夜和四季,可以暂时略过本小节

首先,地球是一个球体(确切的说,是一个椭圆的球体。)

太阳也是一个球体,只不过比太阳大得多。

当太阳发出的光,到达地球后,光照到的部分,天空就亮了起来。

​​

‍

‍

​

那如果没被阳光的部分呢?天空就是黑的,也就是晚上

​

‍

就好比你拿一个手电筒,照着前面的柱子,那么被光照到的部分就是亮着的;柱子的背后就是黑的

‍

​

‍

‍

那为什么会有日夜交替呢?因为地球在自转,就跟一个陀螺一样:

​地球自转​

当东半球转到太阳光能照射到的地方的时候,东半球表现为就天亮了;

与此同时,在地球的另一面,西半球转入黑暗,表项为天黑了

‍

​

# 时区的由来

由于有了自转,人们可以根据太阳的起落来判断时间;但这样有一个问题:各地位置不同时间标准不一,造成时间上的混乱。

因此,人们划分了时区,经度每隔15°,地方时相差1小时,目前,全球共分为24个时区。

这样,对于各个地区的人们来说,12点都是正午时刻,不会出现广州是12点,但是地球的另一边也是12点,但是天已经黑了的情况。

在一些大酒店中,时常能看到多个时钟,就是指多个时区的闹钟等。

▲酒店前台悬挂的不同时区时钟

▲酒店前台悬挂的不同时区时钟

但时区的划分,也有缺点,出国旅行的人,必须随时调整自己的手表,才能和当地时间相一致。   ‍

# 四季的由来

为什么会有四季?因为地球在围绕着地球转圈圈:

​公转​

这个圈圈是一个椭圆。

当地球靠近太阳的时候,地球整体就会变暖,也就是夏天到了。

当地球远离太阳的时候,地球整体就会变冷,也就是冬天到了。

而地球围绕太阳转动一圈的时间,大概是365天。因此季节也就随之更替。

我们称地球围绕着太阳转圈圈的运动为公转

‍

当地球转到到某个地方的时候,其就会逐渐靠近太阳,表现为天气越来越热,我们称这个转折点为夏至;秋风、冬至、春风同理。

​​

‍

如果你家里有暖炉,当你靠近暖炉的时候,你会觉得附近变暖了;当你远离暖炉的时候,你会感觉附近变冷了。地球也是这样。

‍

‍

​

# 自转和公转的来历

地球为什么会自转?为什么地球会绕着太阳转?这个可能没有人知道。。。目前有种说法是:从地球诞生的时候,因为某种原因导致地球转动了起来,并且围绕着太阳转动。

为什么地球就一直转到了现在?因为惯性。好比你在地上转一个陀螺,可能转几分钟就停下来了;但为什么地球能转这么久?因为地球的质量太大了,惯性也非常大;并且在宇宙中阻力很小(在地面上,总得和地面有磨擦、和空气有摩擦,这些阻力都会使得陀螺转的速度降低)

​图来自《盗梦空间》​

‍

举个狸子:同样速度的货车和小车,他们的质量是不同的,惯性也不同;让两者同时停下来,需要耗费的能量也不通过;

如果让2个人去推小车,可能努努力能推动,并让小车有一定的速度(即使速度很小);但如果让2个人去推货车。。可能推都推不动,因为质量相差太大了

‍

‍

‍

‍

# 闰年的来历

地球围绕太阳转一圈不应该就是365天吗?其实不是的。地球绕太阳运行周期,目前为365天5小时48分左右。当4年过去了,我们认为已经过了 4 * 365 天,实际上已经过了大概366天了(5小时48分≈ 6小时,4年就是多出了 4 * 6 个小时,也就是24小时,一天)。

因此,每隔4年,我们会在2月底添加一天,以确保时间的准确;这一年就有366天,我们称之为闰年。其他非闰年的时候,我们称之为平年。

如果我们不添加闰年的话,如果我们认为过去了4000年,但实际上已经过了4000年 + 4000 * 6个小时,也就是240天, 8个月……

假设目前我们认为应该是3月的,但实际上已经多过去了8个月,地球此时已经是秋天了,但日历上还是春天………… 季节就对不上了。

注意,我们需要的精确的时间。

为了方便,人们规定,当一个年份能被4整除的时候,这一年就是闰年。

‍

‍

但是,5小时48分终究不是6小时,只是近似而已。因此,如果按照每四年一个闰年计算,平均每年就要多算出11分钟多(0.0078天),这样经过四百年就会多算出大约3天来。因此每四百年中要减少三个闰年。人们约定,在这400年中,第1年是闰年,第100年、第200年和第300年不是闰年。 例如,2000年是闰年,2100年则是平年,2200,2300年也是;但2400是闰年。现行公历中每400年有97个闰年。

**所以目前闰年的判断方法为:年份是整百数时,必须是400的倍数才是闰年;不是400的倍数的世纪年,即使是4的倍数也不是闰年。**这就是通常所说的:四年一闰,百年不闰,四百年再闰。

‍

那如何用代码判断是否闰年呢?以Java为例

import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		// 能被4整除却不能被100整除或能被400整除的年份就是闰年!
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入年份:");
		int i = sc.nextInt();
		if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0) //与或
		{
			System.out.println("是闰年");
		}
		else 
		{
			System.out.println("不是闰年");
		}

	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

​

# 世界时:第一套时间标准

天是根据地球的自转来定义的:也就是地球自转一圈的时间

年是根据地球的公转来决定的:也就是地球绕太阳一圈的时间

为了更精确的计算时间,人们把一天平均划分为 24 等份,这就是小时 (在古代,用的是时辰)

同理,把 1 小时划分 60分钟,1 分钟划分为 60秒。

因此 1 秒 = 1 / 24 * 60 * 60 = 1 / 86400 天。

后来人们根据天和年的定义,制造了钟表,用来表示时间。

注意,这些定义,都与自转和公转息息相关。

在 1927 年,人们以基于「天文现象」+「钟表计时」,确立了第一套时间标准:世界时(Universal Time,简称 UT)。

‍

‍

# 世界时的缺点:不精确

前面我们说过,地球自转的原因可能没人知道;但地球会一直转下去吗?不会。地球的自转的速度是在慢慢降低的...

地球从46亿年前诞生,大概每过一世纪,一昼夜的时间会增加1.7ms。自转变慢了,意味着地球转动一周的时间变久了。换句话说,也就是在很久很久之前,地球的一天并不是24小时。例如在2.4亿年前,恐龙时期,一天大概23小时

​一只可爱的小恐龙​

为什么地球自转会变慢?大部分原因是因为月球。。月球引发的潮汐现象,会耗费地球的自转能量,降低自转的速度。其他影响自转速度的因素,还有地壳运动、冰川融化、地震等自然现象

‍

这会导致什么问题呢?会导致时间不精确。例如,我们计算时间的时候,一天明明是24小时,但可能过了几年后,一天就不是24小时了。。。

同样的,1秒也不太准确,因为 1 秒 = 1 / 86400 天。(24小时 * 60分钟 * 60秒 = 86400秒)

对于人们的基本生活,可能没有影响。毕竟人类诞生这么久了,没有时间的概念的时候,不也生活了很久吗?

但在一些需要精确计算时间的场景,这就变的很重要了。

例如,体育赛事中百分之一秒的差距就能决定胜负,炮弹的发射要精确在千分之一秒内发生,雷达技术甚至需要精确到百万分之一秒...

	尤其是卫星发射、火箭试验等航天领域,对高精度的时间系统也提出了越来越高的要求!还出现了多种时间单位:毫秒、微妙和纳秒

1s = 1000ms 毫秒 = 10的6次方us 微秒 = 10的9次方ns 纳秒

1ms = 1000 us 微秒

1 us = 1000 ns 纳秒

那么,有没办法解决这个问题呢? 除了观察昼夜和四季,是否有什么物质可以不收外界的影响,其运动的周期一直是稳定的呢?有的,原子。

‍

‍

# 原子钟:完全稳定的一秒

我们想要一个稳定的,不受外界影响的东西,其运动周期是稳定的,因为我们需要每一秒都是固定的,精确的。而以天文观测、地球自转为基础的时间测量,做不到这一点。

科学家们经过层层实验,找到了这样一种原子:铯(sè)原子,其内部的运动周期比其他原子更短,更稳定。

之后,科学家们就以之前定义的「秒」为基础,去测量一秒内这个铯原子内部电子周期运动的「次数」,测量出来的结果为 9192631770 次(91 亿+次)。

因此,在 1967 年,国际度量衡大会决定采用,以铯原子跃迁 9192631770 个周期,所持续的时间长度定义为 1 秒!注意,这个一秒是绝对稳定的,等长的,实现了精确的计时!(1亿年不差1秒)

不用太过深究怎么测量的,物理细节很多;我们这里不展开。

‍

有了原子钟,人们基于原子钟又确立了一套新的时间标准,叫做「国际原子时」(International Atomic Time,简称 TAI)。

这套时间标准,能否直接取代之前数的世界时呢?情况没这么简单.......

‍

‍

# 世界标准时间:加个闰秒

目前,我们有两套时间标准:

  1. 世界时:基于地球自转和公转
  2. 国际原子时:基于铯原子的运动周期

假设我们以国际原子时为时间标准,取代了之前的世界时,会发生什么呢?

  1. 那就是两套时间标准的差距越来越大。因为世界时是越来越慢的(自转越来越慢),在几百年后,可能世界时还是12点,而原子钟可能是下午两点了……
  2. 其次,人们已经用了上千年的世界时,难以被其他时间标准取代
  3. 但我们又需要原子钟这种精确的计时,

怎么办呢?那就各退一步吧!

科学家们重新创建一个时钟标准(第三者),先以原子钟计时;当世界时和原子钟相差1秒的时候,就认为的调整这个第三者的时间(添加或减少一秒),让两者的误差在1s内。

而加的这一秒,科学家把它定义为「​闰秒(Leap Second)」,也就是第60秒。(从0开始到59,有60秒)

​​

‍

‍

相当于让走得快的时钟等一会走得慢的时钟。

这样,我们的每一秒都是精确的,同时和世界时的误差也很小,一举两得。

由于这个时钟是基于原子时 + 世界时「协调」得出的,所以科学家们把它定义为协调世界时(Coordinated Universal Time,简称 UTC)。

至此,科学家们建立的这套时间标准,就是我们现在沿用至今的「​标 准 时 间​」!

至此,全新的世界标准时间确立了,这套时间标准于 1972 年正式确定,一致沿用至今。

‍

# 计算机如何同步时间:授时

有了UTC标准时间,那么我们平时的电子设备是如何同步时间的呢(电脑,手机,平板等)?

原理也很简单,就是有一个专门提供时间的服务器,各个电子设备通过接收该服务器发送的信息,调整自身的时间。当然实现起来还是有一点复杂的,因为网络自身也有延迟,这里暂时不展开。感兴趣的同学可以参考附注1.

‍

‍

# 烦人的闰秒

闰秒是不是百害无一利呢?不是的,至少,在计算机行业里不是……

2012年Reddit一次系统崩溃就因闰秒而起,时长超半小时。一组运行开源Linux操作系统的机器未能正确处理增添的闰秒,导致一连串服务器停止运行。

2017年,美国云安全网络公司Cloudflare受闰秒影响,导致托管在该公司的部分网络资源暂时脱机。

不止一两家,浏览器Mozilla、领英、点评网站Yelp、澳洲航空均因闰秒出现过问题。

‍

阿里云也曾发出的公告:2017年1月1日闰秒调整公告 (opens new window)

尊敬的阿里云用户,

您好,国际地球自转和参考系统服务地球定向中心(IERS)近日通过推特重申,国际标准时间UTC将在格林尼治时间2016年12月31日23时59分59秒(北京时间2017年1月1日7时59分59秒)之后,在原子时钟实施一个正闰秒,即增加1秒,然后才会跨入新的一年。

由于时差的原因,我国将在北京时间2017年1月1日的7时59分59秒和全球同步进行闰秒调整,届时会出现7:59:60的特殊现象。

期间对您的影响如下:

1、如果您的ECS云服务器上运行的应用程序和业务对系统时间没有依赖,可以忽略闰秒的影响。

2、如果您的ECS云服务器上运行的应用程序和业务对系统时间要求比较精确,并且您的ECS服务器上的NTP是使用阿里云默认NTP服务,闰秒调整可能会对您的应用或者业务造成一定影响。请仔细阅读阿里云NTP服务调整方案,评估一下风险,尽量避免。

阿里云的ECS云服务器的NTP服务采用忽略闰秒时刻的跳秒,缓慢同步消除闰秒带来的1秒误差的方案来面对闰秒事件。

详情点此查看 (opens new window)

阿里云计算有限公司

2016年12月19日

‍

这里补充一下:NTP(Network Time Protocol)是一个自动校准时间的服务。

‍

目前,科技公司凑合着弄的主流解决方案是——将多出的一秒分成很多个小段,在不影响运行情况下,悄悄插入时间中,将多出来的一秒「抹平」。

谷歌Meta等大厂均在使用此类方法。

当然,也有人选择直接暂停NTP(网络时间协议)服务一秒钟,以此额外增加一秒。

每次调整,各家公司都出动大批技术运维来调整时间(如暂时关闭NTP等)、修改程序,避免当中出现bug影响业务。

Linux之父,Linus Torvalds曾对媒体提起该话题,也表示出对闰秒的无奈:它真的很烦人,且难以在常规环境下测试,就要交付给用户。

‍

因此,Meta、谷歌、微软等巨头同Linux之父Linus Torvalds,都提倡废除闰秒,还找来美国国家标准与技术研究院(NIST)和国际计量局(BIPM),帮他们背书,一同证明「废除」的合理性。

It’s time to leave the leap second in the past - Engineering at Meta (opens new window)

‍

目前,预计是2035年废除闰秒,直到2135年,期间,计量学家们也在寻找更好的方案。

当然,也不是所有人都支持这个决定,例如俄罗斯:他们的卫星定位系统GLONASS也需要进行相应调整和重新设计,因此,他们希望闰秒取消时间推迟到2040年……

‍

不过,2035年这么久之后的事情,我们到时再看吧,说不定有更好的方案出现了呢 😄

‍

‍

# 总结

好了,总结一下。

这篇文章我们讲了非常多的概念,这里我们再重新梳理一遍。

1、人类的早期生活,依靠观测「天文现象」来测量时间,基于地球自转规律,定义了一套时间标准:「世界时」。

2、后来人们发现,由于地球公转轨道是一个椭圆,并且地球自转还受到地球内部的影响,自转速度越来越慢,人们发现世界时测算出的时间「不准」。

3、科学家们开始从「微观世界」寻找更稳定的周期运动,最终确定以「铯原子」的振动频率为基准,制造出了「原子钟」,确立了「世界原子时」,并重新定义了「秒」长度,时长高度精确。

4、但由于人类社会活动已高度依赖「世界时」,所以科学家们基于「原子时」和「世界时」,最终确立出新的时间标准:「世界协调时」,把它定义成了全球的时间标准,至此,世界标准时间诞生。

5、中国基于「世界协调时」再加上 8 小时时区之差,确立了「北京时间」,并广播给整个中国大地使用。

6、「国家授时中心」把北京时间广播给全国的「时间服务器」,我们生活中使用的时间,例如计算机,就是通过时间服务器自动同步校准的。

7、计算机通过 NTP 完成和时间服务器的「自动校准」,我们的应用程序基于此,才得以获取到准确的时间。

8、NTP 服务应该采用润物细无声的方式同步时间,避免时间发生「倒流」。

‍

‍

# 附注

  1. 计算机时间到底是怎么来的?程序员必看的时间知识! (opens new window)本文主要是阅读了该篇文章,有感而发,非常感谢Kaito大佬写的文章,写的非常详细,直接打赏了;本文则写的略微简单了一点,感兴趣的读者可以看看。
  2. 在地球以亿万年计算的历史中,为什么地球自转没有衰减到近乎停止? - 知乎 (opens new window):有生动和详细的例子,描述了影响地球自转的因素
  3. 另外在知乎和B站上搜寻了相关的截图:第04讲《地球的自转和公转》 (opens new window)
  4. 程序员狂喜?这东西终于要废除了! (opens new window)

‍

在GitHub上编辑此页 (opens new window)
上次更新: 2023/1/22 18:40:33
Git
简单聊聊字符编码

← Git 简单聊聊字符编码→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式