Temporal · 拆解 JS 的新一代日期时间 API
老 Date 把「时刻、墙上时间、日历日期、一段时长」全揉进一个可变对象里,还会隐式地替使用者换算时区。Temporal 把它们拆成一组各司其职、不可变的类型:要精确时刻用 Instant,要某地的墙上时间用 ZonedDateTime,要纯日期 / 纯时间用 Plain*,要一段时长用 Duration。
本系列两页。第一页从 ISO 8601 字符串起步,走过类型全景、Temporal.Now 与 Duration,每个 demo 都跑真实的 temporal-polyfill。第二页拆两起真实的线上事故:一个写死「UTC 加 8 小时得到 SGT」的页面,把 1944 年出生者的生日渲染成了前一天;一个以 +8 落库的 timestamp 被前端当成 UTC 读,全站时间偏 8 小时。两者的根因相同——时间值在系统边界上丢掉了「它是什么」这条信息,而类型正是把这条信息写下来的地方。
拆解 JS 的新一代日期时间 API
老 Date 把时刻、墙上时间、日历日期与时长揉进一个可变对象;Temporal 把它们拆成一组各司其职的不可变类型。
硬编码 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 之所以必错,是因为这张表在二十世纪改了上千次。