Intl.DateTimeFormat:日期与时间
date.toLocaleString() 背后就是它。传入一个 Date(某个绝对时刻),它按 locale 决定语言与排列、按 timeZone 决定投影到哪个城市的墙上时间 (wall-clock time)。两种用法:简便的 dateStyle /
timeStyle 预设(full/long/medium/short),或逐字段精确指定。
1 · 同一时刻在各 locale 下的写法
把固定时刻 2026-06-06 09:30 用 dateStyle:'full' + timeStyle:'short' 显示:
2 · 全功能 playground
选 dateStyle/timeStyle 预设,或切到「逐字段」自行指定;再叠加 timeZone 与 hourCycle:
3 · 同一时刻在各城市的墙上时间
同一个绝对时刻(UTC 2026-06-06T09:30Z),换 timeZone 看各地的墙上时间——这就是「时刻 vs 显示」的分离:
4 · formatToParts & formatRange
formatToParts 把结果拆成带 type 的零件(可自由重排 / 上色);formatRange 会合并两端相同的字段,但合并到什么程度由 locale 的区间模式决定:en-US 配 month/day 得 October 3 – 5,而 zh-CN 在当前 CLDR 下退回 fallback 模式,得
10/3 – 10/5——连 format() 用的「10 月 3 日」字样都没保住(实测 Node 26 / ICU 78.3 与 Chrome 151 一致,核对于 2026-08):
**选择原则:**只要「完整的常规日期/时间」→ 用 dateStyle/timeStyle,不必手挑字段;要「只显示月+日」「带星期几」这种精确控制 → 逐字段({ weekday:'long', month:'short', day:'numeric' })。两套不可混用:同时给 dateStyle 与 weekday 抛
TypeError(注意与非法选项值抛 RangeError 是两回事)。
timeZone 决定显示,不改时刻。Date 本身只是一个 UTC 时间戳;不传 timeZone 时用运行环境的本地时区。要稳定可复现(如服务端、测试),显式传 timeZone。需要做时区运算(而非只显示)请看
Temporal 系列。