无需登录 数据私有 本地保存

Temporal API 演练场 - 现代日期时间处理实验

12
0
0
0
🏗️ Stage 3 Proposal

⏳ Temporal API 演练场

现代 JavaScript 日期时间处理 — 安全、不可变、时区感知

加载 Polyfill... TC39 规范
不可变对象
每次操作返回新实例
时区感知
ZonedDateTime 原生支持
精确计算
纳秒级精度支持
类型明确
PlainDate / Instant 分离
📅 日期基础
⏰ 时间操作
🌍 时区处理
📏 时间段计算
🔄 比较与排序
🎨 格式化 & 实用
📆 今日与下周
JavaScript · Temporal API
📤 执行结果
点击 运行代码 或按 Ctrl+Enter 查看结果...
📚 常见问题 & 知识点
Temporal 是 ECMAScript 的 Stage 3 提案,旨在取代有缺陷的 Date 对象。核心优势:
不可变:所有操作返回新对象,无副作用
类型明确:PlainDate(纯日期)、PlainTime(纯时间)、ZonedDateTime(带时区)等
时区安全:原生支持 IANA 时区数据库
纳秒精度:远超 Date 的毫秒精度
直观API.add().subtract().since() 等语义化方法
截至 2025 年,Temporal 仍处于 Stage 3,尚未被所有浏览器原生支持。但你可以通过 @js-temporal/polyfill 在生产环境中使用。该 polyfill 体积约 50KB (gzip),API 与规范保持一致,当浏览器原生支持时会自动使用原生实现。本演练场已自动加载该 polyfill。
new Date()Temporal.Now.plainDateTimeISO()
Date.now()Temporal.Now.instant().epochMilliseconds
date.getFullYear()plainDate.year
date.setDate(date.getDate()+7)plainDate.add({days:7})
date1 - date2date1.since(date2).days
迁移核心:拥抱不可变模式和明确的类型系统。
PlainDate:仅包含日期(年、月、日),不包含时间和时区信息。适合生日、节假日等场景。
ZonedDateTime:包含日期、时间和时区的完整表示,能正确处理夏令时转换。适合会议安排、航班时间等场景。
选择原则:如果事件的具体时刻在全球范围内有意义,使用 ZonedDateTime;如果只关心日历日期,使用 PlainDate。
duration.total({unit:'hours'}) 将时间段转换为指定单位的浮点数总和。例如 {days:1, hours:6} 使用 .total({unit:'hours'}) 返回 30。这在需要计算总时长、做数值比较或生成图表数据时非常有用。注意需要提供参考日期来处理可变长度单位(如月份)。
ZonedDateTime 使用 IANA 时区数据库,自动处理夏令时。例如在 America/New_York 时区添加 1 天会正确处理 DST 转换日(3 月第二个周日和 11 月第一个周日)。PlainDateTime 则不处理 DST,适合不需要时区语义的场景。这是 Temporal 相比 Date 的重大改进之一。
Temporal 支持从 纳秒 的完整范围。Instant 类型可以表示 ±10⁸ 天(约 27 万年)的时间范围,精度为纳秒。这在科学计算、金融交易、分布式系统等需要高精度时间的场景中非常关键。对比 Date 仅支持毫秒精度且范围有限。
可以!安装 npm install @js-temporal/polyfill,然后在代码中 import { Temporal } from '@js-temporal/polyfill' 即可使用。Node.js 18+ 已内置部分实验性支持(需 --experimental-temporal 标志),但推荐使用 polyfill 以获得完整稳定的 API。未来 Node.js 将原生支持 Temporal。