UTC-8 是一个固定偏移。而洛杉矶的太平洋时间在标准时是 UTC-8,在夏令时是 UTC-7。

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

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

转换一个 epoch 值

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

const date = new Date(1700000000 * 1000);

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

关于排程

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

Frequent questions:

Q: UTC-8 现在是几点?
A: 本页顶部的 UTC-8 实时时钟每秒刷新。要注意北美太平洋时间只有在冬季(大致十一月到三月中)才等于 UTC-8,其余时间同一地区是 UTC-7。
Q: UTC-8 就是 PST 吗?
A: PST(太平洋标准时间)确实是 UTC-8,但只在美加西海岸的冬季有效。三月中到十一月初,同一地区会切到 PDT(UTC-7)。想要全年固定的 UTC-8 锚点,用 Pacific/Tahiti 或 Etc/GMT+8。
Q: UTC-8 和 GMT-8 一样吗?
A: 一样——都表示比零度经线晚 8 小时,日常使用中可以互换。但写代码时请用 UTC。
Q: 怎么把 UTC-8 的时间转成 Unix 时间戳?
A: 给钟面时间加上 8 小时得到 UTC,再取自 1970-01-01 00:00 UTC 以来的秒数。上面的代码示例里有一行搞定的写法。
Q: 为什么七月份 America/Los_Angeles 的时间戳对不上 UTC-8?
A: 因为七月的西海岸用的是太平洋夏令时(UTC-7),不是 UTC-8。America/Los_Angeles 会在 PST 和 PDT 之间自动切换——想要一个永远固定的 UTC-8,请用 Etc/GMT+8。