Moment.js给日期加一年:闰年2月场景下结果不符合预期
解决Moment.js加1年时闰年2月日期不符预期的问题
Moment.js的add(1, 'year')默认逻辑是保留原日期的“日”数值,比如2023-02-28加1年时,它会直接将年份改为2024,日期保留28号,不会自动识别闰年并调整到29号。针对财年结束于2月的场景,更优的处理方式是利用endOf('month')方法,直接获取目标年份2月的最后一天:
const currentFiscalYearEndDate = moment("28/02/2023", "DD/MM/YYYY"); const nextFiscalYearEndDate = currentFiscalYearEndDate .clone() .add(1, "year") .endOf("month"); // 自动转为2024-02-29(含时间的话是2024-02-29T23:59:59.999) // 若只需要日期部分,可再调用startOf('day') const nextFiscalYearEndDateOnly = nextFiscalYearEndDate.clone().startOf('day');
这个方案的优势在于:
- 无需手动判断闰年或日期,Moment会自动处理不同年份2月的最后一天(平年28号,闰年29号)
- 逻辑简洁通用,适用于所有以月末为财年结束日的场景,不止局限于2月
另外,如果你的业务逻辑只关注“财年结束于2月最后一天”,也可以直接构造目标年份的2月最后一天,跳过加1年的步骤:
const currentFiscalYearEndDate = moment("28/02/2023", "DD/MM/YYYY"); const nextYear = currentFiscalYearEndDate.year() + 1; const nextFiscalYearEndDate = moment([nextYear, 1, 1]) // 2月1日(Moment月份是0-based) .endOf("month");
两种方式都能避免手动判断的繁琐,且更符合Moment.js的设计逻辑。
内容的提问来源于stack exchange,提问作者Yogendra
相关产品推荐
相关产品推荐

