Temporal.Duration.compare()

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

静态方法 Temporal.Duration.compare() 返回一个数字(-1、0 或 1),表示第一个 duration 是否短于、等于或长于第二个 duration。

语法

js
Temporal.Duration.compare(duration1, duration2)
Temporal.Duration.compare(duration1, duration2, options)

参数

duration1

用于比较的第一个 duration,可以是字符串、对象或 Temporal.Duration 实例。它使用与 Temporal.Duration.from() 相同的算法转换为 Temporal.Duration 对象。

duration2

用于比较的第二个 duration,使用与 duration1 相同的算法转换为 Temporal.Duration 对象。

options 可选

包含以下属性的对象

relativeTo 可选

一个时区日期(时间)或普通日期(时间),它提供解析 日历 duration 的时间和日历信息(有关此选项的通用解释,请参阅链接)。如果 duration1duration2 是日历 duration,则此选项是必需的(除非它们在组件上相等,在这种情况下,将不进行计算而返回 0)。

返回值

如果 duration1 短于 duration2,则返回 -1;如果它们相等,则返回 0;如果 duration1 长于 duration2,则返回 1

异常

RangeError

如果 duration1duration2日历 duration(即 yearsmonthsweeks 非零),并且未提供 relativeTo,则抛出错误。

描述

如果 relativeTo 是一个带时区的日期时间,并且 duration1duration2 是日历 duration,则通过将 duration 添加到起始点,然后比较结果的瞬间来计算结果。否则,通过将两者都转换为纳秒(假设一天为 24 小时,并在必要时使用 relativeTo 的日历)并比较结果来进行比较。

示例

使用 Temporal.Duration.compare()

js
const d1 = Temporal.Duration.from({ hours: 1, minutes: 30 });
const d2 = Temporal.Duration.from({ minutes: 100 });
console.log(Temporal.Duration.compare(d1, d2)); // -1

const d3 = Temporal.Duration.from({ hours: 2 });
const d4 = Temporal.Duration.from({ minutes: 110 });
console.log(Temporal.Duration.compare(d3, d4)); // 1

const d5 = Temporal.Duration.from({ hours: 1, minutes: 30 });
const d6 = Temporal.Duration.from({ seconds: 5400 });
console.log(Temporal.Duration.compare(d5, d6)); // 0

比较日历 duration

js
const d1 = Temporal.Duration.from({ days: 31 });
const d2 = Temporal.Duration.from({ months: 1 });

console.log(
  Temporal.Duration.compare(d1, d2, {
    relativeTo: Temporal.PlainDate.from("2021-01-01"), // ISO 8601 calendar
  }),
); // 0

console.log(
  Temporal.Duration.compare(d1, d2, {
    relativeTo: Temporal.PlainDate.from("2021-02-01"), // ISO 8601 calendar
  }),
); // 1; February has 28 days

使用带时区的 relativeTo

使用带时区的 relativeTo,您甚至可以考虑夏令时变化。在 2024-11-03,美国从夏令时切换到标准时间,因此该天有 25 小时,因为时钟回拨了 1 小时。

js
const d1 = Temporal.Duration.from({ days: 1 });
const d2 = Temporal.Duration.from({ hours: 24 });

console.log(
  Temporal.Duration.compare(d1, d2, {
    relativeTo: Temporal.ZonedDateTime.from(
      "2024-11-03T01:00-04:00[America/New_York]",
    ),
  }),
); // 1

对 duration 数组进行排序

compare() 函数的目的是作为比较器,传递给 Array.prototype.sort() 和相关函数。

js
const durations = [
  Temporal.Duration.from({ hours: 1 }),
  Temporal.Duration.from({ hours: 2 }),
  Temporal.Duration.from({ hours: 1, minutes: 30 }),
  Temporal.Duration.from({ hours: 1, minutes: 45 }),
];

durations.sort(Temporal.Duration.compare);
console.log(durations.map((d) => d.toString()));
// [ 'PT1H', 'PT1H30M', 'PT1H45M', 'PT2H' ]

这样传递选项

js
durations.sort((a, b) =>
  Temporal.Duration.compare(a, b, {
    relativeTo: Temporal.Now.zonedDateTimeISO(),
  }),
);

规范

规范
Temporal
# sec-temporal.duration.compare

浏览器兼容性

另见