cv.cm

知识库 · 日期与时间

UTC 与时区:它们是如何运作的

阅读约 5 分钟

简短回答

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 显示的时间相同,但两者并不是一回事:

UTCGMT
本质基于原子钟的时间标准历史上是格林尼治的天文时;如今是一个时区名称
偏移按定义就是零点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:00Etc/GMT+12无人居住的贝克岛和豪兰岛;最晚的偏移
-03:30America/St_Johns加拿大纽芬兰(标准时间)
+05:30Asia/Kolkata印度和斯里兰卡
+05:45Asia/Kathmandu尼泊尔
+09:30Australia/Darwin澳大利亚北领地
+12:45Pacific/Chatham新西兰查塔姆群岛(标准时间)
+14:00Pacific/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 这样基于城市的名称。

全部知识文章