JavaScript时间性API简介

144 阅读3分钟

无论你对JavaScript的看法如何,每个人都认为日期处理是一个烂摊子。Date() 对象的实现是在1995年直接从Java中复制的。两年后,Java废止了它,但为了向后兼容,它仍然留在JavaScript中。

这些都是我们使用Date() 所面临的问题。

  • 它只支持UTC和用户的本地时间
  • 不支持非格雷戈里式的日历
  • 夏令时行为是不可预测的
  • 从字符串中解析日期是不可靠的
  • API是笨重的
  • Date 对象是可变的:日期会随着方法的应用而改变。

最流行的替代方案是moment.js日期库。然而,它已经被置于维护模式,不应该在新项目中使用。他们推荐了几个替代品,但每一个都有自己的优点和缺点。

Date() 对象不能从JavaScript中删除,但一个新的Temporal 选项在TC39标准批准过程中处于第二阶段。这里讨论的属性和方法可能会有变化,但该API应该在2021年的某个时候出现在浏览器和运行系统中。

时间性

Temporal 是一个顶级的静态全局对象(如 Math).

其主要目标是。

  • 一个可预测的跨浏览器/运行时行为
  • 更简单的日期和时间计算的API
  • 支持非格雷戈尔式的日历
  • 支持所有的时区,包括夏令时算术
  • 对严格规定的ISO-8601字符串进行解析
  • 使所有的对象都是不可变的

该API是全面的,可能会发生变化,但你可以期待在不久的将来的某个时间点上实现以下主要功能。

当前日期和时间

Temporal.now返回当前的日期/时间,它可以被传递给更多的方法以提供额外的信息。比如说。

// exact time since the Unix epoch on 1 Janary, 1970 UTC
Temporal.now.instant();
Temporal.now.instant().epochSeconds;
Temporal.now.instant().epochMilliseconds;

// current time zone
Temporal.now.timeZone();

// time in current location, e.g.
// 2021-09-18T04:17:48.435068431-04:00[America/New_York]
Temporal.now.zonedDateTimeISO();

// time in another time zone, e.g.
// 2021-09-18T09:17:48.438068435+01:00[Europe/London]
Temporal.now.zonedDateTimeISO('Europe/London');

创建即时日期/时间

Temporal.Instant对象代表一个最接近纳秒的单一时间点。它可以从ISO 8601格式的字符串,或秒、毫秒或微秒的数量中创建。

const
  t1 = Temporal.Instant.from('2021-03-30T01:45:00+01:00[Europe/Berlin]'),
  t2 = Temporal.Instant.from('2021-04-01T02:00+01:00'),
  t3 = Temporal.Instant.fromEpochSeconds(1.0e8),
  t4 = Temporal.Instant.fromEpochMilliseconds(1.0e10),
  t5 = Temporal.Instant.epochNanoseconds(1.0e12);

创建区域感知的日期/时间

Temporal.ZonedDateTime对象表示一个时区和日历感知的日期/时间,它发生(或将发生)在一个特定区域的瞬间。可以使用各种不同的构造函数。

new Temporal.ZonedDateTime(
  1234567890000, // epoch nanoseconds
  Temporal.TimeZone.from('America/Los_Angeles'), // timezone
  Temporal.Calendar.from('iso8601') // default calendar
);

Temporal.ZonedDateTime.from('2025-12-07T03:24:30+02:00[Africa/Cairo]');

Temporal.Instant('2022-08-05T20:06:13+05:45').toZonedDateTime('+05:45');

Temporal.ZonedDateTime.from({
  timeZone: 'America/New_York'
  year: 2025,
  month: 1,
  day: 7,
  hour: 9,
  minute: 30,
  second: 1,
  millisecond: 2,
  microsecond: 3,
  nanosecond: 4
});

继续阅读SitePoint上的 "JavaScript时间API简介"。