无论你对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简介"。