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
的处理方式如下:
- 按年份数向前移动,保持
monthCode
和day
不变。如果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 |
浏览器兼容性
加载中…