Temporal.PlainDate.prototype.add()

可用性有限

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

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

Temporal.PlainDate 实例的 add() 方法返回一个新的 Temporal.PlainDate 对象,该对象表示当前日期根据给定持续时间(以可由 Temporal.Duration.from() 转换的形式)向前移动后的日期。

语法

js
add(duration)
add(duration, options)

参数

duration

表示要添加到此日期的持续时间的字符串、对象或 Temporal.Duration 实例。它使用与 Temporal.Duration.from() 相同的算法转换为 Temporal.Duration 对象。

options 可选

包含以下属性的对象

overflow 可选

一个字符串,指定日期组件超出范围时的行为。可能的值是

"constrain"(默认)

日期组件被限制在有效范围内。

"reject"

如果日期组件超出范围,则抛出 RangeError

返回值

一个新的 Temporal.PlainDate 对象,表示由原始 PlainDate 指定的日期加上持续时间后的日期。

异常

RangeError

如果结果不在 可表示范围 内,即距 Unix 纪元 ±(108 + 1) 天(约 ±273,972.6 年),则抛出此错误。

描述

duration 的处理方式如下:

  • 按年份数向前移动,保持 monthCodeday 不变。如果 monthCode 在结果年份中无效(格里高利历和 ISO 8601 不可能,但带有闰月的日历可能),我们根据 overflow 选项进行调整:对于 constrain,我们根据该日历用户的文化习俗选择另一个月份。例如,由于闰月通常被认为是另一个月份的复制品,我们可能会选择它所复制的月份。
  • 按月数向前移动,必要时调整年份,保持 day 不变。如果 day 在结果月份中无效(例如 2 月 30 日),我们根据 overflow 选项进行调整:对于 constrain,我们选择最接近的有效日期(例如 2 月 28 日或 29 日)。
  • 所有常用日历都使用固定长度的周,因此周数只是转换为天数。如果规则更复杂,我们可能会采取类似于月份偏移的方法。
  • 对于所有非日历单位(天、小时、分钟、秒、毫秒、微秒、纳秒),它们都转换为天数。一天的分数部分将被忽略。然后,我们按该天数向前移动,必要时调整月份和年份。

添加持续时间等同于减去它的负值

示例

在 ISO 8601 日历中添加持续时间

js
const start = Temporal.PlainDate.from("2021-01-01");
const end = start.add({ years: 1, months: 2, weeks: 3, days: 4 });
console.log(end.toString()); // 2022-03-26

const end2 = start.add({ years: -1, months: -2, weeks: -3, days: -4 });
console.log(end2.toString()); // 2019-10-07

const distance = Temporal.PlainDate.from("2020-01-01").until("2021-01-01"); // 366 days
const end3 = start.add(distance);
console.log(end3.toString()); // 2022-01-02

在非 ISO 日历中添加持续时间

js
const start = Temporal.PlainDate.from("2021-01-01[u-ca=chinese]");
console.log(start.toLocaleString("en-US", { calendar: "chinese" })); // 11/18/2020
const end = start.add({ months: 1 });
console.log(end.toLocaleString("en-US", { calendar: "chinese" })); // 12/18/2020

带溢出的持续时间添加

如果我们将日期移动几个月,并且相应的天在该月中无效,那么我们将根据 overflow 选项调整天。

js
const start = Temporal.PlainDate.from("2021-01-31");
const end = start.add({ months: 1 });
console.log(end.toString()); // 2021-02-28

// Any further day additions are based on the clamped month-day:
const end2 = start.add({ months: 1, days: 31 });
console.log(end2.toString()); // 2021-03-31

// Compare with the same addition in a different order that results in no overflow:
const end3 = start.add({ days: 31 }).add({ months: 1 });
console.log(end3.toString()); // 2021-04-03

对于不同年份有不同月份数的日历(通常是由于闰月),月份也可能发生溢出。

js
const start = Temporal.PlainDate.from("2023-04-01[u-ca=chinese]");
console.log(start.toLocaleString("en-US", { calendar: "chinese" })); // 2bis/11/2023; "bis" means leap month
const end = start.add({ years: 1 });
console.log(end.toLocaleString("en-US", { calendar: "chinese" })); // 3/11/2024

// Compare:
const start = Temporal.PlainDate.from("2023-04-30[u-ca=chinese]");
console.log(start.toLocaleString("en-US", { calendar: "chinese" })); // 3/11/2023
const end = start.add({ years: 1 });
console.log(end.toLocaleString("en-US", { calendar: "chinese" })); // 3/11/2024; same day as above!

请注意,以下情况不是溢出,因为月份可以简单地递增

js
const start = Temporal.PlainDate.from("2021-01-01");
const end = start.add({ days: 100 });
console.log(end.toString()); // 2021-04-11

如果日期组件超出范围,也可以抛出错误

js
const start = Temporal.PlainDate.from("2021-01-31");
const end = start.add({ months: 1 }, { overflow: "reject" }); // RangeError: date value "day" not in 1..28: 31

const start = Temporal.PlainDate.from("2023-04-01[u-ca=chinese]");
const end = start.add({ years: 1 }, { overflow: "reject" }); // RangeError: invalid "monthCode" calendar field: M02L

添加时间持续时间

一天的分数部分将被忽略。

js
const start = Temporal.PlainDate.from("2021-01-01");
const end = start.add({ hours: 25 }); // Same as adding 1 day
console.log(end.toString()); // 2021-01-02

规范

规范
Temporal
# sec-temporal.plaindate.prototype.add

浏览器兼容性

另见