1. 时间的设计
缘起
自古以来,各地的人们都是用太阳升起和落下来度量一天,这是千百年来的形成的习惯与文化。例如,在中国,古人使用“日晷”作为计时工具,就是通过太阳位置变化而导致影子位置变化来度量时间。
一般把一天当中太阳位置最高的时候,定为一天的中间,即正午。使用当前的计时方式,即用数字来描述一天中的时间变化,正午就是 12 点,
同时,地球不断进行自西向东的自转,因此东边会比西边先看到太阳,这就导致了世界各地无法使用完全一样的时间计量,比如,东边已经到了 12 点,西边可能还没看到太阳,同一客观时刻,东边的时间度量会比西边的时间度量靠前。世界各地的同一时间度量,如 12 点,实际上并不是客观上的同一时刻,世界各地这种时间度量可以称之为地方时间。
为了能够让世界各地人们对表述的客观时刻有一个一致的理解,需要在兼顾人们习惯、让大家各自表达各自时间的基础上,同时客观上的时刻可以对应上,这就需要有一个可以协调一致的方案 — 时区即为此而设计!
时区的设计 — GMT 体系
为统一世界的时间,同时兼顾各地的使用方便,并且要换算容易,1884 年召开的华盛顿的“国际本初子午线会议”规定了时区的设计:
- 将全球按经线从东到西划分为 24 个时区
- 英国(格林威治天文台旧址)为中时区(0 时区),东、西各 12 个时区,每个时区跨越经度 15 度,东、西第 12 区跨越东西各 7.5 度)。
- 相邻区域的时间相差 1 小时(这样 24 个时区刚好是 24 小时,地球自转一周),这代表着在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过 1 小时。
凡向西走,每过一个时区,就要把表拨慢 1 小时(比如 2 点拨到 1 点);凡向东走,每过一个时区,就要把表拨快 1 小时(比如 1 点拨到 2 点)。跨过几个区域就加或减几小时。这样使用起来就很方便。
例如,中国东 8 区的时间总比泰国东 7 区的时间早 1 小时,而比日本东9区的时间晚 1 小时。因此,出国旅行的人,必须随时调整自己的手表,才能和当地时间相一致。
在这次会议上,格林位置时间被采纳为全球标准,用来确定全球各地的时区。这个全球标准时间就称为格林威治时间(Greenwich Mean Time, GMT)。人们有时候也会采用一个更新更正式的名称来称呼它 — 世界时间(Universal Time, UT)。
更精准的时间度量 — UTC 的出现
GMT 使用之后,科学家发现 GMT 是有秒级误差的,而使用原子钟则可以获得更精准的时间测量。为了获得更为精准的时间,以国际原子钟为计算基准,同时兼顾人们的习惯,即新的时间系统要尽量接近原有的世界时间(UT),方便使用,就诞生了一个折衷的方案 — 协调世界时(Coordinated Universal Time, UTC)。
Coordinated Universal Time,顾名思义,就是以我为基准,向我看齐的意思。UTC 是当前世界最主要的时间标准。
英语 Coordinated Universal Time,简称 CUT,法语 Temps Universel Coordonné,简称TUC。在使用 CUT 还是 TUC 上无法达成一致,最终妥协,使用 UTC。UTC 的简写是一个不准确,但是有助于和平的产物!
UTC 与 GMT 在设计的本质上各不相同:前者以原子时为依据,是确定时间值的标准;而后者则是时区上的概念,作为世界上不同地区人口生活的时间参照。
UTC 与 GMT 虽存在技术上的区别,但在实际使用中,UTC 与 GMT 大致重合,其时间的值基本一致,即可以认为两者是等同的!即
UTC = GMT
世界主要地区地方时间的使用
美国地方时间的使用
时间简称 | 时间全称 | 与 UTC 的时差 |
---|---|---|
UTC | Coordinated Universal Time | 0 |
GMT | Greenwich Mean Time | =UTC |
UT | Universal Time | =UTC |
EST | 东部标准时间(Eastern Standard Time) | -5h |
EDT | 东部夏令时间(Eastern Daylight Time) | -4h |
CST | 中央标准时间(Central Standard Time) | -6h |
CDT | 中央夏令时间(Central Daylight Time) | -5h |
MST | 山区标准时间(Mountain Standard Time) | -7h |
MDT | 山区夏令时间(Mountain Daylight Time) | -6h |
PST | 太平洋标准时间(Pacific Standard Time) | -8h |
PDT | 太平洋夏令时间(Pacific Daylight Time) | -7h |
美国位于 0 时区西向,时间晚于 UTC 时间。
欧洲和印度地方时间的使用
时间简称 | 时间全称 | 与 UTC 的时差 |
---|---|---|
UTC | Coordinated Universal Time | 0 |
WET | 西欧时间(Western European TIme) | =UTC |
WEST | 西欧夏季时间(Western European Summer Time) | +1h |
BST | 英国夏季时间(British Summer Time) | +1h |
IST | 爱尔兰夏季时间(Irish Summer Time) | +1h |
CET | 中部欧洲时间(Central European Time) | +1h |
CEST | 中部欧洲夏季时间(Central European Summer Time) | +2h |
EET | 东部欧洲时间(Eastern European Time) | +2h |
EEST | 东部欧洲夏季时间(Eastern European Summer Time) | +3h |
IST | 印度标准时间(India Standard Time) | +5.5h |
欧洲与印度位于 0 时区东向,时间早于 UTC 时间。
中国地方时间的使用
中国时区位于东 8 区,使用中国标准时间(China Standard Time, CST)。
CST 缩写有多种解释,在确认具体时间的时候,要明确其使用的是哪种含义,
时间简称 | 时间全称 | 与 UTC 的时差 |
---|---|---|
UTC | Coordinated Universal Time | 0 |
CST | 古巴标准时间(Cuba Standard Time) | -4h |
CST | 美国中部标准时间(Central Standard Time) | -6h |
CST | 中国标准时间(China Standard Time) | +8h |
CST | 澳大利亚中部时间(Central Standard Time) | +9:30h |
2. 计算机中的时间
计算机要服务于世界各地区的使用者,最重要的需求就是系统中的时间要符合本地人们的时间习惯,这个时间就是计算机所在地区的地方时间,即 local time。计算机中所有的时间类型,都是服务于准确的计算出 local time 这一目的。
计算机中涉及的时间类型
计算机系统中涉及时间类型,主要有以下几种:
- RTC时间(REAL-TIME CLOCK, 实时时钟)
实时时钟是 PC 主板上的晶振及相关电路组成的时钟电路的生成脉冲,它控制着计算机系统的时间。操作系统中所提到的 RTC,指的就是在计算机主板控制下的时间,即系统时间,为计算机硬件的内部时钟。
-
UTC时间(Universal Time Coordinated,通用协调时)
通用协调时是最主要的世界时间标准,是由国际无线电咨询委员会规定和推荐,并由国际时间局(BIH)负责保持的以秒为基础的时间标度,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。
-
GMT时间(GMT, Greenwich Mean Time,格林尼治平均时)
格林尼治平均时是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时,因为本初子午线被定义为通过那里的经线。
-
世界各地的地方时间
时间系统在 Linux 中的实现
为了确保时间和日期保持正确,*nix 系统会使用一个同步程序,使计算机的时钟与网络上的准确时间源同步。这个参考的时间源可以与计算机主机位于一个网络上,也可以位于 Internet 上。
同步程序使用 NTP(Network Time Protocol) 协议,在后台运行,定期自动检查时间和日期,根据需要进行修正。
尽管时间检查是自动的,但计算机系统经常与不同时区的主机进行通信,此时,某些程序对通信双方的时间有特定的要求,就经常要手动修改主机的时区和时间。
时区的文件信息
- 时区文件存储目录 –
/usr/share/zoneinfo
- 系统当前所采用的本地时间 –
/etc/localtime
/etc/localtime
会软链接到一个具体的时区文件上- 这是计算机系统最重要的时间信息!
相关指令
- date 指令 – 查看系统时间与时区
- date 查看时间与时区
- date -u 查看地方时间对应的 UTC 时间
- date -R 查看地方时间与 UTC 时间的时差
- tzselect 指令 – 修改系统时区
-
timedatectl 指令 – 修改系统时间
如,在某系统下,执行 timedatectl
,可得
gogetter@gogetter-ThinkPad:~$ timedatectl
Local time: 四 2018-11-08 22:42:06 CST
Universal time: 四 2018-11-08 14:42:06 UTC
RTC time: 四 2018-11-08 14:42:06
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: yes
3. 多操作系统的时间同步问题
不同操作系统,对时间的理解不同,选取标准也不同。如此,也造成了一个计算机系统上安装多种操作系统时,时间不同步的问题。
在安装 Ubuntu 和 Windows 双系统的情况下,Ubuntu 的时间总会和 Windows 的时间相差 8 小时。原因在于,Windows 和 Ubuntu 对于 local time 的计算方法不同。
首先,Windows 和 Ubuntu 都会以硬件时间(即 BIOS 时间)作为时间基点,进行本地时间换算;但是,Windows 和 Ubuntu 对于 BIOS 时间的理解有所不同。Windows 很直接,认为 BIOS 时间即为本地时间,Ubuntu 认为 BIOS 时间是 UTC 时间,本地时间需要利用 UTC 进行换算。操作系统最终呈现时间为 local time,即为东八区 CST 时间。如上例所示,RTC 时间即为 BIOS 时间,Windows 系统直接认为硬件时间就是本地时间,BIOS 时间就是 local time,即 14:42:06;而 Ubuntu 认为 BIOS 的时间为 UTC 时间,local time 应该为东八区时间,即 14:42:06 + 8 = 22:42:06
。如此一来,造成两个系统时间相差 8 个小时。
时间同步调整方法
原理:让 Windows 和 Ubuntu 对于时间的理解达成一致。
1). 改 Ubuntu 设置
不对 Windows 进行修改,改变 Ubuntu 对 BIOS 时间的理解。使得 Ubuntu 将 BIOS 时间的理解由 UTC 时间改为 local time,即将硬件时间由 Ubuntu 默认的 UTC 改为 CST,
sudo timedatectl set-local-rtc 1
重启后生效。
2). 改 Windows 设置
不对 Ubuntu 进行修改,改变 Windows 对时间的理解。调整 Windows 设置,使其与 Ubuntu 一样,也将硬件时间当做 UTC,而不是默认的 local time。
在注册表项 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControl/SetControlTimeZoneInformation
中添加一个名为 RealTimeIsUniversal
的值,类型为 REG_DWORD,数据为 1
Reference
- http://www.nndssk.com/xtwt/170138rVFUTR.html
- https://www.likecs.com/show-204274085.html#sc=318
- https://zhuanlan.zhihu.com/p/336737579
- Fix Time Differences Between Ubuntu 16.04 and Windows 10 (Dual Boot)