取而代之,以后不用再 new Date() 了

本文介绍了JavaScript中Date对象存在的问题,包括时区、解析和计算API的不足。文章详细阐述了Temporal新特性的诞生背景,它是为解决这些问题而设计的。Temporal提供了ZonedDateTime、Instant、PlainDateTime等类型,支持多种日期和时间操作,包括时区、日历和非公历的处理,以及日期时间的转换和算术运算。文章还展示了如何使用Temporal创建和转换各种类型,以实现更精确和灵活的日期时间处理。
摘要由CSDN通过智能技术生成

Date背景


众所周知,在 1995 年,Brendan(JavaScript之父) 被网景公司安排了一个巨大而紧急的工作任务,用 10 天的时间来编写 JavaScript 语言。而 日期处理 是几乎所有编程语言的基本部分,所以JavaScript 也必须拥有它。

这是一个非常复杂的领域,但留给作者编写它的时间却很短。最终 Brendan 选择了借鉴当时红极一时的 java 语言,从java.Util.Date日期实现中复制了 Javascript 的日期对象。坦率地说,这个实现很糟糕。事实上 Java 在两年后的 1.1 版本中就弃用和替换这种实现。然而 20 年后,我们仍然在 JavaScript 编程语言中使用这个 API。

Date存在的问题


  • 不支持除用户本地时间以外的时区

不支持开发人员通过 API 来切换时区信息。

  • 解析器行为不可靠以至于无法使用

new Date();
new Date(value);
new Date(dateString);
new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);

开发人员常常因为输入的参数格式问题,引发时间错误,导致程序崩溃。比如输入 ('2022-02-22') 和 (2022,02,22) 得到的结果却不同,

  • 计算 API 缺失

涉及时间的运算逻辑通常都需要开发人员自己去写,比如比较两个时间的长短,时间之间的加减运算,没有自己的计算API

  • 不支持非公历

除了全球通用的公历外,无法使用各国的自己的历法。比如中国的农历

Temporal的诞生


为了弥补 Date 的缺陷,很多程序员着手开发一些开源的库来绕过对 Date 的直接使用,比较优秀的npm库如 date.js 、moment.js,但 Date 的问题始终困扰着 Javascript 这门语言的进一步发展,于是 TC39 组织开始了对 Date 的升级改造,他们找到了 moment.js 库的作者,Maggie ,由她来担任新特性 Temporal的主力设计。

感兴趣的同学可以去博客[1]阅读更多细节,该网页的控制台已经支持Temporal 对象或者在本地运行,安装Temporal的 polyfill

$ npm install @js-temporal/polyfill
import { Temporal} from '@js-temporal/polyfill';

Temporal是一个全局对象,像 Math 、Promise 一样位于顶级命名空间中,为 Javascript 语言带来了现代化的日期、时间接口。

如图所示,一个全面的Temporal包含三个部分:

绿色区域为 ISO 8601 格式的 日期和时间;

黄色区域为时区(日本东京);

红色区域为日历(日本历法);

ISO 8601格式:国际通用时间格式,T用来分割日期(2020-08-05)和时间(20:06:13),“+”或者“-”分别代表东时区和西时区。+09:00,代表东九区。

对比 Date

new Date()
//Fri Jan 28 2022 17:03:11 GMT+0800 (中国标准时间)

Date 采用 GMT格式(旧的时间表示格式) 的时间,使用方面不如 ISO 8601 通用,同时不包含 时区和历法。

Temporal各种类型介绍


推翻重新设计的Temporal,包含5种主要 类型,每个类型负责不同的功能,类型之间还可以相互进行转换。

学会了这5种类型的 功能 以及类型的之间的 关系 ,就基本掌握了Temporal。

下面是Temporal各种类型的功能与转换关系图,非常重要,十分有利于我们全面理解和使用Temporal,下文将逐步讲解。

ZonedDateTime

定义:最全面的Temporal类型,与时区和日历都有关联。表示从地球上特定区域的角度来看,在特定时刻发生的事。

使用场景:在北京时间的 2008年5月12日14时28分4秒发生汶川大地震,或者 在 纽约时间的 2008年5月12日01时28分4秒发生了汶川大地震。

如何获得一个 ZonedDateTime 类型?


不仅是获得一个 ZonedDateTime 类型,其实所有的 T

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值