我总结了一些计算机经常遇到时间相关的概念。作为前瞻知识...
在工程开发(尤其是底层系统编程)中,搞清楚概念的“血缘关系”和“标准出处”,才能用利索各种 API。
本文是新一篇文章集讲各种标准下的时间相关的库的前瞻知识的提及这些名词几乎贯穿时间相关的历史长河,自然也和接口设计有关,所以有必要看。
我深度梳理了这些核心时间概念的起源、命名及其背后标准:(以及一些补充的话题)
1. 天文计时的遗产:GMT (格林威治标准时间)
-
提出组织:英国皇家格林威治天文台(Royal Observatory)。
-
标准化进程:1884 年在华盛顿召开的国际经度会议(International Meridian Conference),确立了以经过格林威治的子午线为本初子午线。
-
命名的由来:直接以地点命名。它是基于地球自转观测得到的“平太阳时”。
-
地位变迁:在 1972 之前,它是事实上的世界时间标准。但在现代高精度领域,它已被 UTC 取代,现在更多被视为一个时区名称(UTC+0),而非时间计量标准。
2. 物理计时的革命:TAI (国际原子时)
-
提出组织:BIPM(国际计量局,位于法国巴黎)。
-
标准化进程:1967 年,第 13 届国际计量大会(CGPM)将“秒”的定义从地球公转周期改为铯-133 原子振荡周期。
-
命名的由来:法语 Temps Atomique International。英文翻译不得劲因为缩写不是 TAI 而是 IAT(International Atomic Time)。毕竟是位于法国的组织提出来的所以跟法国姓。
-
核心特性:它是最“纯粹”的时间,不考虑地球转快了还是转慢了,只管原子跳动。目前 UTC 与 TAI 之间存在恒定的秒差(截至目前,TAI 比 UTC 快 37 秒)。
3. 工程世界的妥协:UTC (协调世界时)
-
提出组织:ITU-R(国际电信联盟无线电通信部门,前身 CCIR)与 BIPM。
-
遵循标准:ITU-R TF.460-6 建议书。
-
命名的由来:
- 英语国家想叫 CUT(Coordinated Universal Time)。
- 法语国家想叫 TUC(Temps Universel Coordonné)。
- 最后妥协:为了公平,大家各退一步,取了一个都不属于两者的缩写 UTC。
-
设计的精妙:UTC 采用了原子时的“频率”(走得一样快),但通过闰秒机制去对齐天文时(UT1),确保误差不超过 0.9 秒。
4. 计算机系统的抽象:Unix Time / POSIX Time 时间戳
-
提出组织:贝尔实验室(Unix 早期开发者)及后来的 IEEE。
-
遵循标准:POSIX.1 (IEEE 1003.1),ISO/IEC 9945。
-
定义的由来:
-
Epoch(纪元):定在 1970-01-01 00:00:00 UTC。
-
处理闰秒的方式:这是一个著名的工程“槽点”。POSIX 标准规定 Unix 时间在闰秒发生的时刻重复计算最后一秒或步进,它在数学定义上忽略了闰秒。这意味着
Unix Time = UTC - 闰秒偏移。 -
命名:通常称为“时间戳”(Timestamp)。
-
5. 现代操作系统中的分类:Real-time vs Monotonic
这两个概念主要出现在 POSIX 实时扩展(Realtime Extensions)中,是针对硬件计时器在软件层的抽象。
Real-time (墙上时间/挂钟时间)
-
标准定义:POSIX 中的
CLOCK_REALTIME。 -
命名由来:模拟(实验室或其他任何地方)墙上的时钟(Wall Clock)。
-
工程意义:它可以被管理员手动修改,也可以被 NTP 协议自动校准。它代表的是“社会共识时间”,但不适合用来计算两次任务的精确间隔,因为时间可能会“倒流”或“跳变”。
Monotonic-time (单调时间)
-
标准定义:POSIX 中的
CLOCK_MONOTONIC。 -
命名由来:数学术语 Monotonic(单调),意为“只增不减”。
-
工程意义:它从系统启动(boot)开始计时。不受 NTP 校时或系统时间修改的影响。在 C++/Linux 开发中,所有的性能测试(Profiling)和定时器实现都必须使用单调时间,以防止由于系统校时导致的程序逻辑错误。
核心组织与概念关系图表
| 概念 | 主要负责组织 | 核心标准 | 特点 |
|---|---|---|---|
| GMT | 皇家格林威治天文台 | 1884 国际经度会议 | 基于地球自转,已逐渐退居时区名 |
| TAI | BIPM (国际计量局) | SI 国际单位制 | 绝对稳定,不带闰秒的原子时 |
| UTC | ITU-R (国际电联) | ITU-R TF.460 | 目前的民用基准,带闰秒机制 |
| Unix Time | IEEE / The Open Group | POSIX.1 (IEEE 1003.1) | 忽略闰秒的整数秒,计算机存储基准 |
| Monotonic | 内核/硬件规范 | POSIX 实时扩展 | 绝对递增,不受外部校时干扰 |
Supplement 补充
UTC 2035年取消闰秒
虽然 UTC 运行了半个多世纪,但由于“闰秒”会导致计算机系统和卫星导航(如 GPS)出现同步故障,2022 年国际计量大会已通过决议:计划在 2035 年之前取消(或大幅放宽)闰秒。这意味着未来 UTC 可能会更倾向于原子时,而稍微偏离天文观测。
计算机的墙上时间怎么来的
- 对于计算机系统的时间比如墙上时间 Realtime,怎么来的:一般是主板的计时芯片 RTC 一般是纽扣电池供电。保证关机后,下次开机还记得时间是多久,但是精度肯定没有那么高了但是够用。RTC 常见的有在主板 BIOS 里面设置定时开机,然后跑定时任务的。在开机后设置了系统时间,然后有更精确的硬件系统时钟:
- TSC 寄存器(TimeStamp Counter 时间戳计数器)它从处理器复位(开机)开始,随着时钟周期不断自增。
- HPET (High Precision Event Timer 高精度事件定时器) HPET 是由 Intel 和微软联合开发的,位于主板芯片组(南桥)内的一个硬件计时器。开销较高,读取 HPET 需要通过总线(如寄存器映射 I/O)访问芯片组,速度比读取 CPU 内部的 TSC 慢得多(大约慢 10-100 倍)。
系统开机后以 RTC 时间为基础利用CPU高进度时钟来计时,然后通过 NTP(Network Time Protocol) 服务去网络上拉取准确 UTC 时间,但一般不会直接将 realtime 跳变(step)到 UTC 时间 除非时间差很大,一般都是通过增加高精度计时器的速率慢慢 slew 到 UTC 时间。
UTC 如何保证精确
- 在互联网规模下,保证全球数百万台服务器的 UTC 时间精准且同步,主要依靠一套严密的分层架构和动态校准协议。其核心支撑是 NTP (Network Time Protocol)。
- 原子钟 (Atomic Clocks): 利用铯原子能级跃迁的频率计时,每几千万年才误差 1 秒。
- GNSS (全球卫星导航系统): 如 GPS、北斗。卫星上载有原子钟,它们持续广播极其精确的时间信号。
还要克服网络延迟,会利用往返时延来计算。误差而且还需要考虑相对论来计算因为体量比较大了相对论效应已经很明显了:
互联网 UTC 的源头是 GPS/北斗卫星。由于相对论,卫星上的时间与地面时间并不同步:
- 狭义相对论(运动导致变慢): 卫星以约 1.4 万公里/小时的速度绕地飞行。根据狭义相对论,高速运动的物体时间会变慢。这导致卫星钟每天比地面慢约 7 微秒。
- 广义相对论(引力导致变快): 卫星距离地面约 2 万公里,那里的引力场比地面弱得多。根据广义相对论,引力越弱,时间流逝越快。这导致卫星钟每天比地面快约 45 微秒。
两者抵消后,卫星时钟每天比地面快 38 微秒。
后果: 如果不修正这 38 微秒,GPS 定位每天会累积 11 公里的误差。互联网的所有高精度同步都会在几小时内崩溃。
总结:
你所看到的 UTC 并不是自然的产物,它是人类利用物理公式,强行把一个“扭曲、不同步”的宇宙时间,修剪成的一条“笔直、统一”的数轴。
如果没有相对论修正,你现在甚至无法用手机打到一辆准时的网约车。
更多推荐

所有评论(0)