🕐 JavaScript Temporal API 完全指南
为什么需要 Temporal?
Moment.js 是 JavaScript 处理日期时间的经典库,但存在以下问题:
- 体积过大: 无法 tree-shaking,整个库被打包
- 可变对象: 调用方法会修改原对象,导致意外行为
- 维护状态: 2020年已进入维护模式,不再推荐新项目使用
🎯 Temporal API 优势:
- ✅ 不可变对象 - 不修改原对象
- ✅ 1-based 索引 - 月份从1开始(而非0)
- ✅ 原生时区支持 - 无需额外库
- ✅ 零 bundle 体积 - 浏览器内置
- ✅ 纳秒级精度
浏览器支持
- Chrome 144+ ✅
- Firefox 139+ ✅
- Safari 即将支持
- Polyfill:
@js-temporal/temporal-polyfill
核心对比
1. 创建当前时间
// Moment.js
const now = moment();
// Temporal API
const now = Temporal.Now.zonedDateTimeISO();
2. 创建指定日期
// Moment.js
const date = moment('2026-03-16');
// Temporal - 按类型选择
const plainDate = Temporal.PlainDate.from('2026-03-16');
const instant = Temporal.Instant.from('2026-03-16T09:00:00Z');
const zoned = Temporal.ZonedDateTime.from({
timeZone: 'Asia/Shanghai',
year: 2026, month: 3, day: 16
});
3. 日期计算
// Moment.js - 会修改原对象!
const nextWeek = now.add(7, 'days'); // 原对象也被修改了
// Temporal - 不可变,返回新对象
const nextWeek = now.add({ days: 7 }); // 原对象保持不变
4. 时区转换
// Moment.js - 需要 moment-timezone 库
const now = moment();
now.tz('Asia/Shanghai'); // 修改原对象
// Temporal - 原生支持
const now = Temporal.Now.zonedDateTimeISO();
const shanghai = now.withTimeZone('Asia/Shanghai');
5. 格式化
// Moment.js
date.format('YYYY-MM-DD');
// Temporal - 使用 Intl API
date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
});
迁移检查清单
- 用
Temporal.Instant替换绝对时间点 - 用
Temporal.PlainDate/PlainTime替换无时区日期时间 - 用
Temporal.ZonedDateTime替换需要时区的场景 - 使用
add/subtract进行日期运算(返回新对象) - 使用
toLocaleString配合 Intl 进行格式化 - 非 ISO 字符串需要先转换为 ISO 格式
💡 Pro Tip: 如果你的项目还在使用 Moment.js,是时候开始规划迁移了!Temporal API 已进入 Stage 4,已成为 ECMAScript 标准的一部分。