最近开发的时候遇到一种情况,就是后台只返回开始日期和结束日期,但是页面需要展示这一段时间的日期列表,所以写个工具函数处理一下这类问题。
解决思路:
1、判断遍历开始日期和结束日期存在的三种情况
(1)同年同月
(2)同年不同月
(3)不同年不同月
2、获取开始日期所在月的月底日期数,便于在遍历的时候作为一个判断条件,将大于这个数的日期额外处理。
3.、格式化日期
实现代码:【目前只支持开始日期和结束日期相隔不超过一个月】
function getRangeDate(startDate, endDate) {
let targetArr = [];
let start = new Date(startDate);
let end = new Date(endDate);
let startDateInfo = {
year: start.getFullYear(),
month: start.getMonth() + 1,
day: start.getDate()
};
let endDateInfo = {
year: end.getFullYear(),
month: end.getMonth() + 1,
day: end.getDate()
};
if(startDateInfo.year === endDateInfo.year){ //同年
if(startDateInfo.month !== endDateInfo.month){ //同年,不同月份
//获取开始时间所在月的月底日期
let startMax = new Date(startDateInfo.year, startDateInfo.month, 0).getDate();
let endNum = startMax - startDateInfo.day + endDateInfo.day;
for(let i = startDateInfo.day; i <= startDateInfo.day+endNum; i++){
if(i > startMax){
targetArr.push(`${endDateInfo.year}-${
endDateInfo.month<10?
"0"+ endDateInfo.month:
endDateInfo.month
}-${i-startMax < 10? "0" + (i-startMax): i-startMax}`);
} else {
targetArr.push(`${startDateInfo.year}-${
startDateInfo.month<10?
"0"+ startDateInfo.month:
startDateInfo.month
}-${i < 10? "0" + i: i}`);
}
}
} else { //同年同月
for(let i = startDateInfo.day; i <= endDateInfo.day; i++){
targetArr.push(`${startDateInfo.year}-${
startDateInfo.month<10?
"0"+ startDateInfo.month:
startDateInfo.month
}-${i<10? "0"+ i: i}`)
}
}
} else { //不同年 【既然不同年那肯定也不同月】
let startMax = new Date(startDateInfo.year, startDateInfo.month, 0).getDate();
let endNum = startMax - startDateInfo.day + endDateInfo.day;
for(let i = startDateInfo.day; i <= startDateInfo.day+endNum; i++){
if(i > startMax){
targetArr.push(`${endDateInfo.year}-${
endDateInfo.month<10?
"0"+ endDateInfo.month:
endDateInfo.month
}-${i-startMax < 10? "0" + (i-startMax): i-startMax}`);
} else {
targetArr.push(`${startDateInfo.year}-${
startDateInfo.month<10?
"0"+ startDateInfo.month:
startDateInfo.month
}-${i < 10? "0" + i: i}`);
}
}
}
return targetArr;
}