FE-Interview
FE-Interview copied to clipboard
给定起止日期,返回中间的所有月份
// 输入两个字符串 2018-08 2018-12
// 输出他们中间的月份 [2018-9, 2018-10, 2018-11]
扫描下方二维码,获取答案以及详细解析,同时可解锁800+道前端面试题。
// 给定起止日期,返回中间的所有月份
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' ]
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')
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'));
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]
}
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;
}
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;
}
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'))
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("-"));
}
思路
- 如果 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");