js中某个时间增加N个月的函数

184 阅读1分钟

网络上常见的思路

var nowDate = date.addMonth(3); //date格式的时间类型

Date.prototype.addMonth = function (addMonth) {
 var y = this.getFullYear();
 var m = this.getMonth();
 var nextY = y;
 var nextM = m;
 //如果当前月+要加上的月>11 这里之所以用11是因为 js的月份从0开始
 if ((m + addMonth)> 11) {
  nextY = y + 1;
  nextM = parseInt(m + addMonth) - 12;
 } else {
  nextM = this.getMonth() + addMonth
 }
 var daysInNextMonth = Date.daysInMonth(nextY, nextM);
 var day = this.getDate();
 if (day > daysInNextMonth) {
  day = daysInNextMonth;
 }
 return new Date(nextY, nextM, day);
 };
 Date.daysInMonth = function (year, month) {
 if (month == 1) {
  if (year % 4 == 0 && year % 100 != 0)
  return 29;
  else
  return 28;
 } else if ((month <= 6 && month % 2 == 0) || (month = 6 && month % 2 == 1))
  return 31;
 else
  return 30;
 };

换个思路

function dateAddMonth (date, addMonth) {
 const array = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
 const month = date.getMonth()
 const allMonth = month + addMonth
 const startMonth = month
 let sumDays = 0
 let year = date.getFullYear()
 let index = startMonth
 if (addMonth > 0) {
   for (let i = startMonth; i < allMonth; i++) {
     if (((year % 100 === 0 && year % 400 === 0) || (year % 100 !== 0 && year % 4 === 0)) && index === 1) {
       sumDays += 29
     } else {
       sumDays += array[index]
     }
     index++
     if (index >= array.length) {
       year++
       index = 0
     }
   }
 } else {
   for (let i = startMonth; i >= allMonth; i--) {
     if (((year % 100 === 0 && year % 400 === 0) || (year % 100 !== 0 && year % 4 === 0)) && index === 1) {
       sumDays -= 29
     } else {
       sumDays -= array[index]
     }
     index--
     if (index <= 0) {
       year--
       index = 11
     }
   }
 }
 console.log(sumDays)
 date.setDate(date.getDate() + sumDays)
 return date
}

网络上的思路可能需要改进,因为如果增加12个月以上,就会出问题