Hacker News 中文摘要

RSS订阅

《Temporal:修复JavaScript时间问题的九年历程》 -- Temporal: A nine-year journey to fix time in JavaScript

文章摘要

文章讲述了JavaScript时间处理库Temporal历时9年的开发历程。作者作为彭博社工程师参与了TC39标准制定,介绍了彭博终端大量使用JavaScript的情况,以及团队如何推动Temporal这一解决JavaScript时间处理问题的标准提案。

文章总结

《Temporal:JavaScript 时间处理的9年革新之路》

背景与动机

JavaScript 自1995年诞生以来,其内置的 Date 对象因直接移植自 Java 的 java.util.Date,存在诸多设计缺陷: - 可变性:方法调用可能意外修改原对象。 - 时区模糊:解析行为不一致,可能默认为本地时间或 UTC。 - 算术陷阱:如月份加减可能导致非法日期(如1月31日加1个月变为3月2日)。 - 精度不足:仅支持毫秒级,无法满足金融等高精度场景需求。

2017年,Moment.js 维护者 Maggie Johnson-Pint 提出 Temporal 提案,旨在彻底重构 JavaScript 的日期时间处理方式,获 TC39 委员会认可并进入标准化流程。


Temporal 的核心特性

  1. 不可变性:所有操作返回新对象,避免副作用。
  2. 显式时区与日历:支持 IANA 时区数据库和多种历法(如希伯来历)。
  3. 精准类型设计
    • ZonedDateTime:带时区的完整时间点(替代 Date)。
    • PlainDate/PlainTime:纯日期或时间(无时区)。
    • Duration:时间跨度计算。
  4. 纳秒级精度:满足高精度时间戳需求。

示例对比: ```javascript // 旧版 Date 的问题 const date = new Date("2026-01-31"); date.setMonth(date.getMonth() + 1); // 错误结果:3月2日

// Temporal 解决方案 const date = Temporal.PlainDate.from({ year: 2026, month: 1, day: 31 }); date.add({ months: 1 }); // 正确返回2月28日 ```


标准化历程与协作

  • 阶段推进:2018年进入 Stage 1,2026年达 Stage 4,成为 ES2026 标准。
  • 多方合作:Bloomberg、微软、Google、Igalia 等公司共同推动,其中 Bloomberg 因金融终端对时区的严苛需求深度参与。
  • 技术突破
    • 跨引擎共享库 temporal_rs(Rust 实现)提升开发效率,通过 Test262 全部 4500+ 测试用例。
    • 集成国际化规范(ECMA-402),支持多历法运算。

现状与未来

  • 浏览器支持:Firefox、Chrome、Edge 已全面实现,Safari 部分支持。
  • 生态整合:下一步计划与日期选择器、DOMHighResTimeStamp 等 Web API 深度兼容。
  • 行业意义:标志着 JavaScript 社区通过协作解决长期痛点的能力,为复杂应用提供可靠的时间处理基础。

作者:Jason Williams(Bloomberg 高级工程师,TC39 代表)
原文链接Bloomberg JS Blog
发布日期:2026年3月11日

(注:本文精简了技术细节与历史背景,保留核心内容与关键示例。)

评论总结

以下是评论内容的总结:

  1. 对Temporal的积极评价

    • 多位用户赞扬Temporal的设计,特别是其不可变性和时区处理的明确性(patchnull:"Temporal fixes both by forcing you to be explicit about timezones... and by returning new objects instead of mutating")。
    • 用户认为Temporal是经过深思熟虑的现代API(virgil_disgr4ce:"Very nice to use a modern, extremely well thought-through API!")。
  2. 对API设计的批评

    • 部分用户认为Temporal的API冗长且不够简洁(hungryhobbit:"Dear god, that’s so much uglier!")。
    • 有用户指出Temporal对象难以序列化,不适合在客户端和服务器之间传递(VanCoding:"a pain to pass it over the wire... I’d clearly prefer a set of pure functions")。
  3. 与其他技术的比较

    • 用户提到Java的Joda-Time和JSR 310对Temporal的可能影响(plucas:"Java’s own solutions had some influence?")。
    • 有用户质疑为何未提及JodaTime(normie3000:"No mention of JodaTime?")。
  4. 对Safari支持的调侃

    • 用户调侃Safari对Temporal的支持不完整,称其为“IE的精神继承者”(zvqcMMV6Zcr:"Safari confirmed as IE Spiritual successor")。
  5. 其他观点

    • 有用户对Temporal的发布表示祝贺(nekevss:"Super happy to see Temporal accepted!")。
    • 部分用户对时间处理的最佳实践提出疑问(philipallstar:"What happens when 'now' changes?";darepublic:"store in UTC.. exchange only in UTC")。

总结:评论总体对Temporal持积极态度,但也对其API设计和实际使用中的问题提出了批评,同时与其他技术进行了比较。