知识库 · 日期与时间
UTC 与时区:它们是如何运作的
简短回答
UTC(协调世界时)是所有民用时区的基准时钟。时区是共享同一当地时间的区域,写作相对 UTC 的偏移,如 -05:00 或 +05:30,并附带夏令时开始和结束的规则。偏移范围从 -12:00 到 +14:00,有些并不是整小时。
UTC 是什么
UTC 由国际计量局(BIPM)根据全球数百台原子钟计算得出。它以国际单位制秒计时,与国际原子时(TAI)相同,但会不时用闰秒进行调整,使其与地球自转的差距保持在 0.9 秒以内。自 2017 年起,UTC 比 TAI 慢 37 秒。
UTC 不实行夏令时,也从不随季节变化。正是这种稳定性,让服务器、日志、航空和数据库都采用 UTC。
UTC 与 GMT 的区别
日常使用中,GMT 和 UTC 显示的时间相同,但两者并不是一回事:
| UTC | GMT | |
|---|---|---|
| 本质 | 基于原子钟的时间标准 | 历史上是格林尼治的天文时;如今是一个时区名称 |
| 偏移 | 按定义就是零点 | UTC+00:00 |
| 夏令时 | 从不 | 本身不实行,但英国夏季会从 GMT 切换到 BST(UTC+01:00) |
| 在软件中的用法 | 标准基准 | 多作为标签使用;建议用 UTC |
实际的陷阱是:「伦敦时间」只有在冬季才等于 GMT。从 3 月最后一个周日到 10 月最后一个周日,伦敦比 UTC 快一小时。
偏移不等于时区
+01:00 这样的偏移描述的是某一时刻。时区描述的是一个地方随时间的变化:它的偏移、夏令时规则,以及这些规则的所有历史变更。IANA 时区数据库被 Linux、macOS、Android、Java 和所有主流浏览器采用,它按地区和城市命名时区,如 Europe/London、America/New_York 和 Asia/Kolkata。
对于未来或过去的任何时间,Europe/London 都比 +00:00 更好,因为它知道 1 月的偏移是 +00:00,7 月是 +01:00。保存为 +00:00 的周期性会议,一年中有半年会差一小时。
- 过去的时刻用 UTC(或 Unix 时间戳)存储。
- 未来的本地事件存储为当地时间加 IANA 时区名,需要时再计算对应的 UTC 时刻,因为各国政府可能临时修改夏令时规则。
- 避免使用
CST或IST这类缩写:CST既可能是美国中部标准时间(UTC-6),也可能是中国标准时间(UTC+8);IST则被印度、爱尔兰和以色列同时使用。
夏令时
夏令时(DST)会在一年中的部分时间把时钟调快,通常调快一小时。各地的切换日期不同:美国在 3 月第二个周日开始、11 月第一个周日结束;欧盟则在 3 月和 10 月的最后一个周日切换,各地统一在 01:00 UTC 进行。亚洲和非洲的大多数国家,包括中国、日本和印度,都不实行夏令时。南半球的夏令时大约从 10 月持续到次年 4 月。
每次切换都会产生两种边界情况:
- 空档:时钟拨快时,在从 02:00 直接跳到 03:00 的时区,当天 02:30 这样的当地时间并不存在。
- 重叠:时钟拨慢时,01:30 这样的时间会出现两次,所以只有当地时间而没有偏移就会产生歧义。
不寻常的偏移
并不是每个时区与 UTC 都相差整数小时。以下偏移目前都在使用:
| 偏移 | 示例时区 | 地区 |
|---|---|---|
-12:00 | Etc/GMT+12 | 无人居住的贝克岛和豪兰岛;最晚的偏移 |
-03:30 | America/St_Johns | 加拿大纽芬兰(标准时间) |
+05:30 | Asia/Kolkata | 印度和斯里兰卡 |
+05:45 | Asia/Kathmandu | 尼泊尔 |
+09:30 | Australia/Darwin | 澳大利亚北领地 |
+12:45 | Pacific/Chatham | 新西兰查塔姆群岛(标准时间) |
+14:00 | Pacific/Kiritimati | 基里巴斯莱恩群岛;全球最早进入新一天的地方 |
由于偏移跨度达 26 小时,同一个日历日期在地球上某处存在的时间最长约 50 小时。「14 号当天结束前」必须指定时区才有确切含义。
常见问题
UTC 和 GMT 是一回事吗?
两者显示的钟面时间相同,但 UTC 是原子时标准,GMT 是一个时区。英国只在冬季使用 GMT,夏季使用 BST(UTC+01:00)。
UTC 会因夏令时而改变吗?
不会。UTC 全年不变;只有各地时区在夏令时开始或结束时改变相对 UTC 的偏移。
印度为什么用 UTC+05:30?
印度全国使用以东经 82.5° 子午线为中心的单一时区,该经线与格林尼治相差五个半小时。半小时和一刻钟的偏移,是为了更贴近一个国家的经度。
Etc/GMT+12 里的正负号是什么意思?
在 IANA 的 Etc/GMT 名称中,为了兼容 POSIX,正负号是反过来的,所以 Etc/GMT+12 实际是 UTC-12:00。表示真实地点时,请优先使用 Asia/Tokyo 这样基于城市的名称。