FE-Interview icon indicating copy to clipboard operation
FE-Interview copied to clipboard

给定起止日期,返回中间的所有月份

Open lgwebdream opened this issue 5 years ago • 13 comments

// 输入两个字符串 2018-08  2018-12
// 输出他们中间的月份 [2018-9, 2018-10, 2018-11]

lgwebdream avatar Jul 06 '20 15:07 lgwebdream

扫描下方二维码,获取答案以及详细解析,同时可解锁800+道前端面试题。

lgwebdream avatar Jul 06 '20 15:07 lgwebdream


// 给定起止日期,返回中间的所有月份

function getDate(dateStr = '', addMonth = 0) {
    const [year, month] = dateStr.split('-');
    return new Date(year, month - 1 + addMonth);
}
function formateDate(dateStr = new Date()) {
    return `${dateStr.getFullYear()}-${String(dateStr.getMonth() + 1).padStart(2, 0)}`;
}
const getRangeMonth = (startDateStr = '', endDateStr = '') => {
    const result = [];
    let startTime = getDate(startDateStr) ? getDate(startDateStr, 1).getTime() : 0;
    const endTime = getDate(endDateStr) ? getDate(endDateStr).getTime() : 0;
    while (startTime < endTime) {
        const curTime = new Date(startTime);
        result.push(formateDate(curTime));
        curTime.setMonth(curTime.getMonth() + 1);
        startTime = curTime.getTime();
    }
    return result;
}
console.log(getRangeMonth("2018-08", "2018-12")); // [ '2018-09', '2018-10', '2018-11' ]

GolderBrother avatar Sep 06 '20 09:09 GolderBrother

function outPut(startMonth, endMonth) { let _start = new Date(startMonth).getTime() let _end = new Date(endMonth).getTime() let _step = 24 * 60 * 60 * 1000 let _arr = [] for (let i = _start; i <= _end; i += _step) { let _month = new Date(i).getMonth() + 1 < 10 ? 0${new Date(i).getMonth() + 1}: ${new Date(i).getMonth() + 1} let _newDate = ${new Date(i).getFullYear()}-${_month} if (_newDate !== startMonth && _newDate !== endMonth) _arr.push(_newDate) } return Array.from(new Set(_arr)) }

console.log(outPut('2018-08', '2018-12'), 'outPut')

dbfterrific avatar Mar 18 '21 05:03 dbfterrific

function func(date1, date2) {
  function getDate(dateStr) {
    let [year, month] = dateStr.split('-').map(i => { return Number(i) })
    return { year: year, month: month }
  }
  date1 = getDate(date1)
  date2 = getDate(date2)
  let arr = []
  if (date1.year > date2.year || (date1.year === date2.year && date1.month > date2.month)) {
    [date1, date2] = [date2, date1]
  }
  while (date1.year < date2.year || (date1.year === date2.year && date1.month < date2.month - 1)) {
    if (date1.month === 12) {
      date1.month = 1
      date1.year++
    } else {
      date1.month++
    }
    arr.push({ year: date1.year, month: date1.month })
  }
  return arr.map(item => { return item.year + '-' + item.month })
}
console.log(func('2018-08', '2019-12'));

dty999 avatar Jul 08 '21 03:07 dty999

let start = "2018-08",
    end = "2018-12";

start = start.split("-");
end = end.split("-");

let year = 0,
    res = [];

while (start[0] * 1  <= end[0] * 1) {
    find();
}
console.log(res)

function find() {
    let s = start[1]*1+1
    let e = start[0] == end[0] ? end[1]-1 : 12;
    for (let i = s; i <= e; i++) {
        res.push(`${start[0]}-${i}`);
    }
    start = [start[0]*1+1,0]
}

wz-china avatar Oct 31 '21 13:10 wz-china

function genMonthArr(mStart = 1, mEnd = 12) {
  let monthArr = [];
  for (let month = mStart || 1; month <= mEnd; month++) {
    monthArr.push(month);
  }
  return monthArr;
}

function monthsInBetween(start, end) {
  let [yStart, mStart] = start.split("-").map((item) => parseInt(item));
  let [yEnd, mEnd] = end.split("-").map((item) => parseInt(item));
  let yArr = [];
  // get Year Array
  while (yStart <= yEnd) {
    yArr.push(yStart);
    yStart++;
  }
  let dtArr = [];
  for (let year of yArr) {
    // assign start and end
    let mArr;
    if (yArr.length === 1) {
      mArr = genMonthArr(mStart, mEnd);
    } else if (year === yArr[0]) {
      mArr = genMonthArr(mStart);
    } else if (year === yArr.slice(-1)[0]) {
      mArr = genMonthArr(null, mEnd);
    } else {
      mArr = genMonthArr();
    }
    for (let month of mArr) {
      dtArr.push(year + "-" + (month >= 10 ? month : "0" + month));
    }
  }

  return dtArr;
}

clarencess3 avatar Nov 16 '21 06:11 clarencess3

function getMonthsBetweenStartAndEnd(start, end) {
  let startArr = start.split('-');
  let year = parseInt(startArr[0]);
  let month = parseInt(startArr[1]);
  let newDate = new Date(start);
  let endDate = new Date(end);
  let result = [];

  while(newDate.getTime() < endDate.getTime()) {
    result.push(`${year}-${month}`);
    if (month === 12) {
      month = 0;
      year++;
    }
    month++;
    newDate = new Date(`${year}-${month}`);
  }
  return result;
}

Neisun avatar Jan 02 '22 05:01 Neisun

function getMonth(start, end) {
  const [startYear, startMonth] = start.split("-").map((item) => Number(item));
  const [endYear, endMonth] = end.split("-").map((item) => Number(item));

  const yearDiff = endYear - startYear;

  return Array.from({ length: endMonth - startMonth + 12 * yearDiff - 1 }).map(
    (_, index) =>
      [
        startYear + Math.floor((index + startMonth) / 12),
        (startMonth + index) % 12 + 1,
      ].join("-")
  );
}

console.log(getMonth('2018-2', '2020-1'))

RookieGz avatar Feb 15 '22 05:02 RookieGz

      function middleMonth(start, end) {
        start = start.split("-");
        end = end.split("-");
        const months = [];
        while (+start[0] != +end[0] || +start[1] != +end[1] - 1) {
          +start[1]++;
          if (+start[1] === 13) {
            +start[0]++;
            start[1] = 0;
          } else {
            months.push([start[0], start[1].toString().padStart(2, "0")]);
          }
        }
        return months.map((month) => month.join("-"));
      }

lang711 avatar Aug 28 '22 15:08 lang711

思路

  • 如果 start year < end year 添加这一年剩下的月份
  • 如果 start year = end year 添加差额的月份

const getMounth = (start, end) => {
  const result = [];
  const [startYear, startMounth] = start.split("-").map(value => Number(value));
  const [endYear, endMouth] = end.split("-").map(value => Number(value));
  let [indexYear, indexMouth] = [startYear, startMounth + 1];

  const addMouths = (year, startMouth, endMouth) => {
    let index = startMouth;
    while (index < endMouth) {
      result.push(`${year}-${patchMouthValue(index)}`);
      index++;
    }
  };

  console.log(`DEBUG:
    startYear: ${startYear}
    startMounth: ${startMounth}
    endYear: ${endYear}
    endMouth: ${endMouth}`);

  while (indexYear <= endYear) {
    console.log(`DEBUG: 
      Start handle year ${indexYear}
      end year: ${endYear}
      current mouth: ${indexMouth}
      end mouth: endMouth`);

    if (indexYear < endYear) {
      console.log(`Current year < end year, should patch all mouths since current mouth to 12`);
      addMouths(indexYear, indexMouth, 13);
      indexYear++;
      indexMouth = 1;
    } else if (indexYear === endYear) {
      console.log(`Current year equal to end year, just add mouths`);
      addMouths(indexYear, indexMouth, endMouth);
      indexYear++;
      indexMouth = endMouth;
    }
  }

  return result;
};

const patchMouthValue = value => (value >= 10 ? `${value}` : `0${value}`);
getMounth("2016-11", "2018-02");
image

gaohan1994 avatar Apr 28 '24 05:04 gaohan1994