【早阅】JavaScript 的 Temporal 提案将如何改变日期/时间函数

科技   2024-11-24 08:01   福建  

作者:@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.jsdate-fns 或 Luxon 作为替代方案,但应密切关注 Temporal 的发展,以便在未来能够无缝过渡到这一新的标准 API。Temporal 的广泛采用将极大地提升 JavaScript 在日期和时间处理方面的能力,为开发者提供更强大的工具。

😀 每天只需花五分钟即可阅读到的技术资讯,加入【早阅】共学群,可联系 vx:zhgb_f2er

AI 阅:了解技术资讯的一种方式。

🚀可直接通过阅读原文了解详细内容。


前端早读课
探索前端技术,体验产品的情感, 项目思考的指引,塑造独立开发者的未来。
 最新文章