Moment - 将年份添加到日期有时不会给出正确的日期

问题描述 投票:0回答:3

如果下一个财政年度是闰年并且在 2 月结束,则将 1 年添加到当前时刻对象不会给出预期的结束日期。

例如-

如果我将 1 年添加到 2023 年 2 月 28 日(明年是闰年),结果不是 2024 年 2 月 29 日,而是 2024 年 2 月 28 日,这打破了我的进一步实施。

const currentFiscalYearEndDate = moment("28/02/2023", "DD/MM/YYYY"); // 28th Feb 2023
const nextFiscalYearEndDate = currentFiscalYearEndDate.clone().add("1", "year"); // 28th Feb 2024

我知道我可以检查下一年的月份,然后再手动添加 1 天来解决它,但我在想是否有其他更好的方法来解决这个问题。

javascript reactjs momentjs
3个回答
1
投票

手动做

由于您指出的原因,一年实际上不是时间单位。在一个有夏令时的国家,也不是一天。

建议

提取 ISO 格式的日期,然后提取年份。

将年份加一并以 ISO 格式重建日期。

如果您从 2 月 29 日开始,显然您需要特殊处理,但至少它是明确的。


0
投票

之所以将一年加到 2023 年 2 月 28 日得到 2024 年 2 月 28 日而不是 2024 年 2 月 29 日,是因为 moment 库假设一年有 365 天,并且不会自动调整闰年。

处理这个问题的一种方法是使用 moment.js 函数 isLeapYear 来检查下一年是否是闰年,然后相应地调整结束日期。这是一个示例实现:

const currentFiscalYearEndDate = moment("28/02/2023", "DD/MM/YYYY");
const nextFiscalYearEndDate = currentFiscalYearEndDate.clone().add("1", "year");

// Check if the next year is a leap year
const isLeapYear = moment(nextFiscalYearEndDate).isLeapYear();

// If next year is a leap year and current year ends in Feb, adjust end date to 29th Feb
if (isLeapYear && currentFiscalYearEndDate.month() === 1 && currentFiscalYearEndDate.date() === 28) {
  nextFiscalYearEndDate.add("1", "day");
}

console.log(nextFiscalYearEndDate.format("DD/MM/YYYY")); // Output: 29/02/2024


0
投票

最后一个月总是很棘手,因为月份有不同的天数。对于 2 月尤其棘手,因为它甚至在不同年份之间也有所不同。 momentjs 会解决这个问题,例如,当您将一个月添加到

30/01/2023
时。即它会给你
28/02/2023
。但是没有办法自动决定,如果你想要
28/02/2023
或“三月的最后一天”,即
28/03/2023
,当你在
31/03/2023
上加一个月。而且在
add
函数中也没有选项...

最简单的可能不是使用一个月的最后一天作为基准,而是下个月的第一天。这样,添加年或月的结果总是明确定义的。然后加上一年,最后再减去那一天。这样,您将始终获得上个月的最后一天......

const currentFiscalYearEndDate = moment("28/02/2023", "DD/MM/YYYY"); // 28th Feb 2023
const nextFiscalYearEndDate = currentFiscalYearEndDate.clone()
  .add(1, "day") //01/02/2023
  .add(1, "year") //01/03/2024
  .add(-1, "day"); //29/03/2024

为此,重要的是先添加day,然后添加year。因为这样,在

28/02/2023
上它会先去
01/03/2023
,然后到
01/03/2024
,最后,当减去一天到
29/02/2024
。在2025年(即非闰年)当然会去
28/02/2025
而不是...

© www.soinside.com 2019 - 2024. All rights reserved.