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

瀏覽器相容性

另見