Web 平台 API / Temporal · 拆解 JS 的新一代日期时间 API 待审核 2 页

Temporal · 拆解 JS 的新一代日期时间 API

Date 把「时刻、墙上时间、日历日期、一段时长」全揉进一个可变对象里,还会隐式地替使用者换算时区。Temporal 把它们拆成一组各司其职、不可变的类型:要精确时刻Instant,要某地的墙上时间ZonedDateTime,要纯日期 / 纯时间Plain*,要一段时长Duration

本系列两页。第一页从 ISO 8601 字符串起步,走过类型全景、Temporal.NowDuration,每个 demo 都跑真实的 temporal-polyfill。第二页拆两起真实的线上事故:一个写死「UTC 加 8 小时得到 SGT」的页面,把 1944 年出生者的生日渲染成了前一天;一个以 +8 落库的 timestamp 被前端当成 UTC 读,全站时间偏 8 小时。两者的根因相同——时间值在系统边界上丢掉了「它是什么」这条信息,而类型正是把这条信息写下来的地方。

Instant · ZonedDateTime · Plain* · Duration

拆解 JS 的新一代日期时间 API

老 Date 把时刻、墙上时间、日历日期与时长揉进一个可变对象;Temporal 把它们拆成一组各司其职的不可变类型。

1944 年的生日 · +8 存储 · 边界解码

硬编码 offset 与错标时区的代价

写死「UTC 加 8 小时得到 SGT」的页面把 1944 年出生者的生日渲染成前一天;以 +8 落库的 timestamp 被前端当成 UTC 读。两起事故的根因同为时间值在边界上丢掉了语义。

规范 / 文档

  • Temporal Proposal · 文档与规范 tc39.es 提案本体的官方文档,逐类型说明 API 设计与 ISO / RFC 9557 字符串格式。
  • tc39/proposal-temporal GitHub TC39 提案仓库,现已进入 Stage 4(将并入 ECMA-262 / ECMA-402),含 cookbook 与 polyfill 链接。
  • Temporal MDN 各类型与 Temporal.Now 的逐方法参考,以及为何要取代旧 Date 的设计说明。
  • Can I use · Temporal caniuse.com 实时浏览器支持矩阵。Firefox / Chrome 已原生支持,其余环境仍需 polyfill。
  • temporal-polyfill npm 本系列底层所用的轻量 polyfill,在尚未原生支持的环境里提供完整 Temporal 实现。
  • RFC 9557 · 带附加信息的时间戳 rfc-editor.org 2026-08-29T10:00:00+08:00[Asia/Shanghai] 这种在 offset 之外再记 IANA 时区名与历法的格式,即 Temporal 的序列化形式。
  • IANA Time Zone Database iana.org 各地历史 offset 的唯一权威来源。写死一个 offset 之所以必错,是因为这张表在二十世纪改了上千次。