Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
lgwebdream opened this issue Jul 6, 2020 · 10 comments
Open

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

lgwebdream opened this issue Jul 6, 2020 · 10 comments
Labels
JavaScript teach_tag 编程题 teach_tag 顺丰 company

Comments

@lgwebdream
Copy link
Owner

lgwebdream commented Jul 6, 2020

// 输入两个字符串 2018-08  2018-12
// 输出他们中间的月份 [2018-9, 2018-10, 2018-11]
@lgwebdream lgwebdream added JavaScript teach_tag 编程题 teach_tag 顺丰 company labels Jul 6, 2020
@lgwebdream
Copy link
Owner Author

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

@GolderBrother
Copy link

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

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' ]

@dbfterrific
Copy link

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')

@dty999
Copy link

dty999 commented Jul 8, 2021

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'));

@wz-china
Copy link

wz-china commented Oct 31, 2021

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]
}

@clarencess3
Copy link

clarencess3 commented Nov 16, 2021

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;
}

@Neisun
Copy link

Neisun commented Jan 2, 2022

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;
}

@RookieGz
Copy link

RookieGz commented Feb 15, 2022

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'))

@lang711
Copy link

lang711 commented Aug 28, 2022

      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("-"));
      }

@gaohan1994
Copy link

思路

  • 如果 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JavaScript teach_tag 编程题 teach_tag 顺丰 company
Projects
None yet
Development

No branches or pull requests

10 participants