您需要获取增加数月的业务规则。简单的解决方案是:
function addMonths(dateObj, num) { return dateObj.setMonth(dateObj.getMonth() + num);}但是,这将从7月31日更改为9月31日,并将转换为10月1日。同样,1月31日加上1个月是2月31日,根据是否是leap年,它将转换为3月2日或3月3日。
您可能希望第一次是9月30日,第二次是2月28日或29日(取决于是否是leap年)。
因此,如果您希望遵守“月底”,则需要执行以下操作:
function addMonths(dateObj, num) { var currentMonth = dateObj.getMonth() + dateObj.getFullYear() * 12; dateObj.setMonth(dateObj.getMonth() + num); var diff = dateObj.getMonth() + dateObj.getFullYear() * 12 - currentMonth; // If don't get the right number, set date to // last day of previous month if (diff != num) { dateObj.setDate(0); } return dateObj;}但是,请与负责他们想要的业务规则的人核对。
编辑
上面的方法效果很好,但是为了回应McShaman的评论,这里提供了一个更简单的月度过渡检查版本:
function addMonths(date, months) { var d = date.getDate(); date.setMonth(date.getMonth() + +months); if (date.getDate() != d) { date.setDate(0); } return date;}// Add 12 months to 29 Feb 2016 -> 28 Feb 2017console.log(addMonths(new Date(2016,1,29),12).toString());// Subtract 1 month from 1 Jan 2017 -> 1 Dec 2016console.log(addMonths(new Date(2017,0,1),-1).toString());// Subtract 2 months from 31 Jan 2017 -> 30 Nov 2016console.log(addMonths(new Date(2017,0,31),-2).toString());// Add 2 months to 31 Dec 2016 -> 28 Feb 2017console.log(addMonths(new Date(2016,11,31),2).toString());


