跳到主要内容位置

JavaScript Temporal 日期 API 的 6 种常见用法

JavaScript Temporal 日期和时间 API 是用来替代 Date 对象的,现在处于 stage 3 阶段,浏览器和 Node.js 正在对它进行实现。 Temporal API 解决了 Date 对象的一些缺点,例如:

  • 不支持时区,需要手动进行转换。
  • 只支持公历,不支持其他日历,例如我国的农历。
  • 不同浏览器对于同一个时间的计算方式不同,尤其是对于有夏令时的地区。
  • 日期的展示方式对于用户来说不够友好。
  • Date 对象是可变的,容易造成 bug。

这些问题在 Temporal API 中都得到了解决,接下来我们看一下 Temporal API 的常见的使用方法。

配置项目安装 polyfill

因为截止到目前 Temporal API 还没正式发布,我们需要个 Polyfill 来使用它。这里创建了一个 Node.js 项目,然后添加了 @js-temporal/polyfill这个 polyfill 依赖。 之后在 index.js 中导入它提供的 Temporal 对象:

const { Temporal } = require("@js-temporal/polyfill");

获取当前日期

获取当前时间可以通过 Temporal.Now.instance() 方法,这里注意这个 polyfill 需要我们手动调用 toString() 来获取日期字符串,并且这个日期是无关时区的:

console.log(
"Current date and time(without a specific time zone): ",
currentTime.toString()
);

我们也可以分别通过 epochMilliseconds 和 epochNanoseconds 来分别获取当前时间的毫秒数和纳秒数。Temporal 的时间精度可以精确到纳秒:

console.log("milliseconds: ", currentTime.epochMilliseconds);
console.log("nanoseconds: ", currentTime.epochNanoseconds);

创建自定义日期

Temporal 也支持创建自定义日期,可以调用 Temporal.PlainDateTime.from() 方法,然后传递一个对象参数,里边可以通过 year、 month、day、hour、minute 和 second 属性来分别指定年月日和时分秒:

const dateTime = Temporal.PlainDateTime.from({
year: 2018,
month: 2, // no longer need to plus 1
day: 10,
hour: 8,
minute: 12,
second: 48,
});

console.log(dateTime.toString());

另外也可以通过 Temporal.PlainDate 和 Temporal.PlainTime 来分别创建指定日期或时间。

修改日期

要修改日期的话,Temporal 提供了很方便的方法,可以调用 add() 方法来向后推移日期,也可以调用 substract() 向前推移,这两个方法都接收一个对象,里边的参数和创建日期时的一样,可以对年月日时分秒进行增加或减少,需要注意的是 temporal 对象是不可变的,需要把返回值保存到新的变量里边来获取修改后的日期:

const newDateTime = dateTime.add({ months: 1 });
console.log(newDateTime.toString());

比较日期

Temporal 还提供了 since() 方法来比较两个日期,比较的结果是一个对象,可以通过它可以获取相差的天数、月数、小时数等不同维度的时间:

const dt1 = Temporal.PlainDate.from("2023-02-01");
const dt2 = Temporal.PlainDate.from("2023-02-05");
const diff = dt2.since(dt1);
console.log(diff.days);

格式化日期

Temporal API 可以直接获取指定地区日期的特定格式,如果要完全自定义日期格式,还是需要分别获取年月日时分秒,来自行组装:

console.log(`${dt1.year}/${dt1.month}/${dt1.day}`);

获取指定时区的时间

使用 Temporal 获取的时间是无关时区的,如果要获取对应时区的时间,可以在获取当前时间后,调用 toZonedDateTimeISO() 方法,它接收 Temporal.TimeZone 对象实例作为参数,我们可以通过 Temporal.TimZone 对象来指定时区,例如传递 Asia/Shanghai 来获取中国时区:

console.log(
"With time zone: ",
currentTime
.toZonedDateTimeISO(new Temporal.TimeZone("Asia/Shanghai"))
.toString()
);

小结

好了,这个就是 JavaScript Temporal API 的简介和 6 中常见用法,你学会了吗?如果有帮助请三连并关注,想学更多的开发知识,可以在评论区留言,感谢观看!

提示

一系列的课程让你成为高级前端工程师。课程覆盖工作中所有常用的知识点和背后的使用逻辑,示例全部都为工作项目简化而来,学完即可直接上手开发!

即使你已经是高级前端工程师,在课程里也可能会发现新的知识点和技巧,让你的工作更加轻松!

《React 完全指南》课程,包含 React、React Router 和 Redux 详细介绍,所有示例改编自真实工作代码。点击查看详情。

《Vue 3.x 全家桶完全指南与实战》课程,包括 Vue 3.x、TypeScript、Vue Router 4.x、Vuex 4.x 所有初级到高级的语法特性详解,让你完全胜任 Vue 前端开发的工作。点击查看详情。

《React即时通信UI实战》课程,利用 Storybook、Styled-components、React-Spring 打造属于自己的组件库。

《JavaScript 基础语法详解》本人所著图书,包含 JavaScript 全面的语法知识和新特性, 可在京东、当当、淘宝等各大电商购买