作者:@Jesse Hall
原文:https://www.freecodecamp.org/news/how-javascripts-temporal-proposal-will-change-datetime-functions/
背景
JavaScript 长期以来在处理日期和时间方面一直让开发者感到困扰。内置的 Date
对象在 JavaScript 早期就被创建,但它存在许多限制和怪异之处,使得处理日期和时间变得复杂。
幸运的是,新的 Temporal
提案旨在通过提供一个现代、更直观的 API 来解决这些问题。
【第2550期】JS的新一代日期/时间 API Temporal
Temporal API 的主要功能包括:
不可变性:所有 Temporal 都是不可变的,防止意外修改。
清晰的关注点分离:针对不同用例提供不同类型的方法,例如 PlainDate、PlainTime 和 ZonedDateTime。
明确的时区处理:提供更好的时区支持,消除与隐式时区转换相关的混淆。
一致的索引:所有单位都使用从 1 开始的编号,例如月份从 1 月到 12 月。
Temporal API 目前处于 TC39 流程的第 3 阶段,尚未准备好投入生产环境使用。浏览器原生支持也尚未提供。在 Temporal API 广泛可用之前,可以考虑使用以下已建立的库:
Day.js:轻量级、良好的浏览器支援、良好的 TypeScript 支持、可通过插件扩展、拥有庞大的社群和活跃的开发。
date-fns:函数式程序设计方法、Tree-shakeable、良好的 TypeScript 支持。
Luxon:功能类似于 Temporal、预设不可变、原生时区和 Intl 支持。
虽然这些函数库是不错的替代方案,但 Temporal API 将提供以下优势:
原生浏览器支持(无需额外捆绑包大小)。
所有 JavaScript 环境中的标准化 API。
作为原生实现,性能更佳。
所有平台上的一致行为。
要点
Temporal
API 旨在解决 JavaScript 中 Date
对象的多个痛点,包括可变性、月份编号混乱和时区支持有限等问题。它提供了一个不可变、类型分离、时区处理更明确的日期和时间操作接口。
1. 多样化的对象类型
const date = Temporal.PlainDate.from('2024-01-01');
const time = Temporal.PlainTime.from('09:00:00');
const zonedDateTime = Temporal.ZonedDateTime.from('2024-01-01T09:00:00[America/New_York]');
Temporal API 提供了 PlainDate、PlainTime 和 ZonedDateTime 等不同对象类型,分别对应日期、时间和带时区的时间戳,满足不同场景的需求。
2. 可变性问题
当前的 Date
对象是可变的,这可能导致在函数间传递日期时出现意外行为。例如:
const date = new Date('January 1, 2024');
date.setMonth(1); // 修改了原始日期对象
console.log(date); // February 1, 2024
Temporal
API 通过提供不可变对象来解决这个问题:
const date = Temporal.PlainDate.from('2024-01-01');
const nextMonth = date.add({ months: 1 });
console.log(date.toString()); // '2024-01-01' - 原始日期未变
console.log(nextMonth.toString()); // '2024-02-01' - 新对象
3. 月份编号混乱
Date
对象的月份是零基的(0-11),而天数是一基的(1-31),这容易引起混淆。Temporal
则统一使用一基编号:
const date = Temporal.PlainDate.from('2024-01-01');
console.log(date.month); // 1 (January)
4. 时区支持有限
Date
对象的时区处理依赖于系统本地时区,容易导致混淆。Temporal
提供了明确的时区处理:
const nyDateTime = Temporal.ZonedDateTime.from({
timeZone: 'America/New_York',
year: 2024,
month: 1,
day: 1,
hour: 9
});
const tokyoDateTime = nyDateTime.withTimeZone('Asia/Tokyo');
console.log(tokyoDateTime.toString()); // '2024-01-01T23:00:00+09:00[Asia/Tokyo]'
影响
Temporal
API 的引入将显著改善 JavaScript 中日期和时间的处理,减少开发者在使用 Date
对象时遇到的常见问题。它将使日期和时间的操作更加直观、安全和高效,特别是在处理全球化的应用时。
结论
尽管 Temporal
目前仍处于 Stage 3 阶段,尚未准备好用于生产环境,但它的设计理念和功能已经显示出巨大的潜力。开发者可以继续使用现有的库如 Day.js
、date-fns
或 Luxon
作为替代方案,但应密切关注 Temporal
的发展,以便在未来能够无缝过渡到这一新的标准 API。Temporal
的广泛采用将极大地提升 JavaScript 在日期和时间处理方面的能力,为开发者提供更强大的工具。
😀 每天只需花五分钟即可阅读到的技术资讯,加入【早阅】共学群,可联系 vx:zhgb_f2er
AI 阅:了解技术资讯的一种方式。
🚀可直接通过阅读原文了解详细内容。