ES7 (ECMAScript 2016) 引入了一个新的标准时间对象,称为 "Temporal"。这个对象提供了许多新的方法和属性,让开发人员更加方便地处理时间和日期。早期的 JavaScript 版本提供了 Date 对象,但它存在一些固有的问题,例如跨时区的问题和二次加数 (leap seconds) 的考虑问题。Temporal 对象大幅度解决了这些问题,同时提供了更加完善的功能。
Temporal 的基本使用
Temporal 提供了三个主要的类,分别是 Temporal.Instant、Temporal.TimeZone 和 Temporal.PlainDate。其中 Instant 表示一个精确的时间点,TimeZone 表示某一个时区,而 PlainDate 表示一个日期。这些类都是不可变的,也就是说,它们的实例对象是不能被修改的。
我们可以使用 new 运算符创建一个实例对象,例如:
const agora = new Temporal.Instant.now() const tokyo = new Temporal.TimeZone('Asia/Tokyo') const christmas = Temporal.PlainDate.from({ year: 2022, month: 12, day: 25 }, { timeZone: tokyo })
上述代码分别创建了一个代表当前时间的 Instant 对象,一个表示东京时区的 TimeZone 对象,以及一个代表 2022 年 12 月 25 日的 PlainDate 对象,并带有东京时区的信息。
Temporal 的高级用法
除了上述基本用法外,Temporal 还提供了丰富的方法和属性,用于精确处理时间和日期。下面我们来看一些示例:
获取时间戳
Temporal 为 Instant 类提供了一个 toEpochSeconds() 方法,可以方便地获取时间戳。比如我们要获取当前时间的时间戳,可以这样写:
const agora = new Temporal.Instant.now() const timestamp = agora.toEpochSeconds() console.log(timestamp)
运行结果为:当前的时间戳
比较时间
Temporal 的 Instant 类提供了多个比较时间的方法,比如 isEqual()、isBefore()、isAfter() 等,这些方法可以用于比较实例对象之间的大小关系。比如我们要比较两个时间点之间的大小,可以这样写:
const agora = new Temporal.Instant.now() const future = agora.add({ days: 30 }) console.log(future.isAfter(agora)) // true console.log(future.isEqual(agora)) // false console.log(future.isBefore(agora)) // false
上述代码创建了一个代表 30 天后的时间点的 Instant 对象 future,然后使用多个方法比较其大小关系。
格式化时间
Temporal 为 PlainDate 类提供了一个 format() 方法,可以方便地将日期格式化为字符串。这个方法接受一个格式字符串作为参数,其中可以包含一系列占位符,例如:
const tokyo = new Temporal.TimeZone('Asia/Tokyo') const christmas = Temporal.PlainDate.from({ year: 2022, month: 12, day: 25 }, { timeZone: tokyo }) console.log(christmas.format({ month: 'long', day: 'numeric' })) // "December 25" console.log(christmas.format({ year: 'numeric', month: 'short', day: 'numeric', timeZone: 'UTC' })) // "22-Dec-25"
上述代码创建了一个代表东京时区下的 2022 年 12 月 25 日的 PlainDate 对象 christmas,然后使用 format() 方法将其格式化为两种不同的字符串。
总结
Temporal 是一个强大的时间处理工具,可以方便地处理时间和日期,并且避免了 Date 对象的许多问题。在实际开发中,我们应该积极地使用 Temporal,以提高开发效率和代码质量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651b7adb95b1f8cacd322372