🕐 JavaScript Temporal API 完全指南

JavaScript Temporal API Migration ⭐⭐⭐⭐⭐

为什么需要 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' 
});

迁移检查清单

  1. Temporal.Instant 替换绝对时间点
  2. Temporal.PlainDate/PlainTime 替换无时区日期时间
  3. Temporal.ZonedDateTime 替换需要时区的场景
  4. 使用 add/subtract 进行日期运算(返回新对象)
  5. 使用 toLocaleString 配合 Intl 进行格式化
  6. 非 ISO 字符串需要先转换为 ISO 格式
💡 Pro Tip: 如果你的项目还在使用 Moment.js,是时候开始规划迁移了!Temporal API 已进入 Stage 4,已成为 ECMAScript 标准的一部分。

进一步阅读