UTC+8 是一个被多个地区共用的固定偏移,中国、新加坡和西澳大利亚都在其中。当历史规则重要时,请选一个具体地区的 IANA 名字。

有地点名的时候就用地点名

写代码或保存用户偏好时,优先用 Asia/Shanghai,而不是缩写或裸偏移。IANA 时区携带了一个地区完整的历史规则和夏令时规则;偏移只告诉你某一刻和 UTC 差多少。

转换一个 epoch 值

Unix 时间戳本身就是一个瞬间。想在这个时区里显示它,数值原样不动,只用选定的 IANA 名字去格式化。钟面显示会变,事件本身不会。

const date = new Date(1700000000 * 1000);

const text = new Intl.DateTimeFormat("zh-CN", {
  dateStyle: "medium",
  timeStyle: "medium",
  timeZone: "Asia/Shanghai",
}).format(date);

关于排程

如果一个会议或定时任务是按当地钟面时间定义的,请把 IANA 时区和日程一起存。如果它是一次性事件,就存换算出来的 UTC 瞬间或 Unix 时间戳。把这两种情况分开,夏令时切换才不会变成一次意外改期。

Frequent questions:

Q: UTC+8 现在是几点?
A: 本页顶部的 UTC+8 实时时钟每秒刷新。由于 UTC+8 范围内没有任何主要辖区实行夏令时,它相对 UTC 的偏移永远正好是 8 小时。
Q: UTC+8 和 GMT+8 一样吗?
A: 在所有实际用途上都一样——都表示比零度经线早 8 小时。UTC 是现代的原子钟标准,GMT 是基于太阳时的历史叫法。写代码时请用 UTC。
Q: UTC+8 实行夏令时吗?
A: 目前 UTC+8 范围内没有主要辖区实行夏令时。中国、新加坡、马来西亚、菲律宾、台湾地区和西澳大利亚全年保持 UTC+8。
Q: 怎么把 UTC+8 的时间转成 Unix 时间戳?
A: 把钟面时间视为 UTC+8,减去 8 小时得到 UTC,再取自 1970-01-01 00:00 UTC 以来的秒数。大多数语言都有一行搞定的辅助函数,参见上面的代码示例。
Q: UTC+8 和 CST 有什么区别?
A: CST 这个缩写有歧义——它可能指中国标准时间(UTC+8),也可能指美国中部标准时间(UTC-6),两者相差 14 小时。写代码时请用 IANA 名字(Asia/Shanghai 对 America/Chicago),免得混淆。