如何遍历出全部的月份

比如说我的是“2017-01”和“2017-05”
我想遍历输出全部的月份,怎样写才能输出
["2017-01","2017-02","2017-03","2017-04","2017-05"]
还有就是存在跨年的情况例如“2017-11”和“2018-03”
怎样输出
["2017-11","2017-12","2018-01","2018-02","2018-03"]

阅读 5.7k
7 个回答

这是我的实现方式,仅供参考

function traverse(start, end) {
    start = start.split('-');
    end = end.split('-');
    var startYear = parseInt(start[0]),
        startMon = parseInt(start[1]),
        endYear = parseInt(end[0]),
        endMon = parseInt(end[1]);

    if(startMon<1 || startMon>12){
      throw new Error('初始月份不正确');
    }
    if(endMon<1 || endMon>12){
      throw new Error('终止月份不正确');
    }

    var result = [];
    var year, mon;

    for (year = startYear; year < endYear;) {
        for(mon = startMon; mon<=12; mon++){
          result.push(year +'-'+ (mon<10?'0'+mon:mon));
          if(mon == 12) year++;
        }
    }
    if(startYear == endYear){
      mon = startMon;
    }else{
      mon = 1;
    }
    for (; mon <= endMon; mon++) {
        result.push(endYear +'-'+ (mon<10?'0'+mon:mon));
    }

    return result;
}
// 转换为时间戳
var startTime = new Date("2017-11").getTime();
var endTime = new Date("2018-03").getTime();
// 存放结果
var arr = []
// 最后的格式转换
var format  = function(time) {
    var date = new Date(time)
    return date.getFullYear() + '-' + (date.getMonth() + 1)
}
// 判断是否为闰年
var isLeapYear = function(year) {  return (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)  }
// 月份映射 假设不为闰年
var MONTH = {
    '1': 31,
    '2': 28,
    '3': 31,
    '4': 30,
    '5': 31,
    '6': 30,
    '7': 31,
    '8': 31,
    '9': 30,
    '10': 31,
    '11': 30,
    '12': 31
}
arr.push("2017-11")
while (startTime < endTime) {
    // 转换时间格式
    var start = new Date(startTime)
    // 判断是否为闰年的2月份
    if (isLeapYear(start.getFullYear()) && (start.getMonth() + 1 === 2)) {
        startTime = startTime + 29 * 24 * 60 * 60 * 1000
    } else {
        // 其他情况
        startTime = startTime + MONTH[start.getMonth() + 1] * 24 * 60 * 60 * 1000
    }
    arr.push(format(startTime))
}
arr.push("2018-03")
console.log(arr)

写的有些麻烦

function getMonth(a,b){
    var ayear = a.split('-')[0];
    var amonth = a.split('-')[1];
    var byear = b.split('-')[0];
    var bmonth = b.split('-')[1];
    var arr = [];
    if(ayear == byear){
        for(var i=amonth;i<=bmonth;i++){
            arr.push(ayear+'-'+i);
        }
    }else{
        for(var i=amonth;i<=12;i++){
            arr.push(ayear+'-'+i);
        }
        for(var j=bmonth;j>=1;j--){
            arr.push(byear+'-'+j);
        }
        var cyear = parseInt(ayear)+1;
        for(var k=cyear;k<byear;k++){
            for(var i=1;i<=12;i++){
                arr.push(k+'-'+i)
            }
        }
    }

    console.warn(arr);
}
getMonth('2016-12','2017-4')
function allDate(start, end) {
        start = start.split('-');
        var res = [],
            year = +start[0],
            month = +start[1],
            date = new Date(year, month, 0),
            endTime = new Date(end).getTime();
        while (date.getTime() <= endTime) {
            res.push(year + '-' + month.toString().replace(/^(\d)$/, '0$1'));
            //加一天,强制到下一月份
            date = new Date(date.getTime() + 24 * 60 * 60 * 1000);
            year = date.getFullYear();
            month = date.getMonth() + 1;
            date = new Date(year, month, 0);
        }
        res.push(end)
        return res
    }
    console.log(allDate('2017-01', '2018-12'))
  function getMonth(start,end) {
    if(start === end) {
        return [start]
    }
    // ...
    var start = start.split('-');
    var end = end.split('-');
    var startYear = parseInt(start[0]);
    var startMonth = parseInt(start[1]);
    var yearCount = end[0] - startYear;
    var monthCount = end[1] - startMonth;
    var count = yearCount*12 + monthCount; // 两个时间相差的月数
    var arr = [];
    if (count < 0) {
      count = -count; // 负数 就倒置
      startYear = parseInt(end[0]);
      startMonth = parseInt(end[1]);
    }
    for (var i=0; i<=count;i++) {
      arr.push(startYear+ '-' +(startMonth>=10?startMonth:'0' + startMonth));
      startMonth += 1;
      if (startMonth === 13) {
        startMonth = 1;
        startYear += 1;
      }
    }
    return arr;
  }

呼呼哈哈 | 用了很多隐式转换的东西 为了减小代码量

function allMonth(start, end){
  end = end.replace("-","");
  var i = start.replace("-",""), result=[];
  for(;;i++){
    if(i.toString().substr(4) == 13) i=i+88;
    if(i > end) return result;
    var iString = i.toString();
    result.push(iString.substr(0, 4) + "-" + iString.substr(4));
  }
}
allMonth("2017-11","2018-03");
推荐问题