Web 平台 API / Intl · 浏览器内置的本地化引擎 / Intl.DateTimeFormat:日期与时间 待审核 6 / 9
DateTimeFormat · 日期时间

Intl.DateTimeFormat:日期与时间

date.toLocaleString() 背后就是它。传入一个 Date(某个绝对时刻),它按 locale 决定语言与排列、按 timeZone 决定投影到哪个城市的墙上时间 (wall-clock time)。两种用法:简便的 dateStyle / timeStyle 预设(full/long/medium/short),或逐字段精确指定。

1 · 同一时刻在各 locale 下的写法

把固定时刻 2026-06-06 09:30dateStyle:'full' + timeStyle:'short' 显示:

图 1-1 · 同一时刻在各 locale 下的完整日期时间写法对照。

2 · 全功能 playground

dateStyle/timeStyle 预设,或切到「逐字段」自行指定;再叠加 timeZone 与 hourCycle:

图 2-1 · 预设与逐字段两套写法的实时试验台,可叠加时区与 hourCycle 观察输出与 resolvedOptions。

3 · 同一时刻在各城市的墙上时间

同一个绝对时刻(UTC 2026-06-06T09:30Z),换 timeZone 看各地的墙上时间——这就是「时刻 vs 显示」的分离:

图 3-1 · 同一个绝对时刻投影到各城市的墙上时间。

4 · formatToParts & formatRange

formatToParts 把结果拆成带 type 的零件(可自由重排 / 上色);formatRange 会合并两端相同的字段,但合并到什么程度由 locale 的区间模式决定:en-USmonth/dayOctober 3 – 5,而 zh-CN 在当前 CLDR 下退回 fallback 模式,得 10/3 – 10/5——连 format() 用的「10 月 3 日」字样都没保住(实测 Node 26 / ICU 78.3 与 Chrome 151 一致,核对于 2026-08):

图 4-1 · formatToParts 拆出的带类型零件,可自由重排与着色。
图 4-2 · formatRange 的输出:合并程度由 locale 的区间模式决定。

**选择原则:**只要「完整的常规日期/时间」→ 用 dateStyle/timeStyle,不必手挑字段;要「只显示月+日」「带星期几」这种精确控制 → 逐字段({ weekday:'long', month:'short', day:'numeric' })。两套不可混用:同时给 dateStyleweekdayTypeError(注意与非法选项值抛 RangeError 是两回事)。

timeZone 决定显示,不改时刻。Date 本身只是一个 UTC 时间戳;不传 timeZone 时用运行环境的本地时区。要稳定可复现(如服务端、测试),显式传 timeZone。需要做时区运算(而非只显示)请看 Temporal 系列。