JS时间对象使用之按月与日期划分时间段
场景:传入三个参数2020-02-02,2020-08-01,31,开始日期,结束日期,分隔日期
要求:从开始日期到结束日期,按每个月31号划分成日期段(不足的自动按照当月最后一天)
dataMonth(value1, value2, day) { var getDate = function (str) { var tempDate = new Date(); var list = str.split("-"); tempDate.setFullYear(list[0] * 1); tempDate.setDate(1); tempDate.setMonth(list[1] * 1 - 1); tempDate.setDate(list[2] * 1); return tempDate; }; var date1 = getDate(value1); var date2 = getDate(value2); var dateArr = new Array(); var i = 0; dateArr[i] = new Array(); if (!day) { dateArr[i] = [value1, 0]; i++; } else { dateArr[i][0] = value1; } date1.setDate(1); date1.setMonth(date1.getMonth() + 1); while ( !( date1.getFullYear() > date2.getFullYear() || (date1.getFullYear() == date2.getFullYear() && date1.getMonth() > date2.getMonth()) ) ) { // console.log(1111, getLastDay(date1.getFullYear(), date1.getMonth() + 1)) let lastDay = getLastDay(date1.getFullYear(), date1.getMonth() + 1); if (!day) { dateArr[i] = [ date1.getFullYear() + "-" + ((date1.getMonth() + 1).toString().length == 1 ? "0" + (date1.getMonth() + 1) : date1.getMonth() + 1) + "-0" + 1, 0, ]; } else { dateArr[i + 1] = new Array(); let currentDay = date1.getFullYear() + "-" + ((date1.getMonth() + 1).toString().length == 1 ? "0" + (date1.getMonth() + 1) : date1.getMonth() + 1) + "-" + ((day * 1).toString().length == 1 ? "0" + day : day); if (day * 1 > lastDay * 1) { currentDay = date1.getFullYear() + "-" + ((date1.getMonth() + 1).toString().length == 1 ? "0" + (date1.getMonth() + 1) : date1.getMonth() + 1) + "-" + lastDay; } dateArr[i][1] = currentDay; let next = getDate(currentDay); // console.log(2222, currentDay, next) let nextDay = nextDate(next); dateArr[i + 1][0] = nextDay; // console.log(111, getDate(dateArr[i + 1][0])) } i++; // date1.setDate(date1.getDate() + 1); date1.setMonth(date1.getMonth() + 1); } // console.log(111, date1) if (day) { let lastDay = getLastDay(date1.getFullYear(), date1.getMonth() + 1); let currentDay = date1.getFullYear() + "-" + ((date1.getMonth() + 1).toString().length == 1 ? "0" + (date1.getMonth() + 1) : date1.getMonth() + 1) + "-" + ((day * 1).toString().length == 1 ? "0" + day : day); if (day * 1 > lastDay * 1) { currentDay = date1.getFullYear() + "-" + ((date1.getMonth() + 1).toString().length == 1 ? "0" + (date1.getMonth() + 1) : date1.getMonth() + 1) + "-" + lastDay; } dateArr[i][1] = currentDay; } console.log("dateArr", dateArr); return dateArr; // 获取指定日期下一天 function nextDate(date) { date = new Date(date); date = +date + 1000 * 60 * 60 * 24; date = new Date(date); return ( date.getFullYear() + "-" + ((date.getMonth() + 1).toString().length == 1 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-" + (date.getDate().toString().length == 1 ? "0" + date.getDate() : date.getDate()) ); } // 获取指定年份最后一天 function getLastDay(year, month) { var new_year = year; //取当前的年份 var new_month = month++; //取下一个月的第一天,方便计算(最后一天不固定) if (month > 12) { new_month -= 12; //月份减 new_year++; //年份增 } var new_date = new Date(new_year, new_month, 1); //取当年当月中的第一天 return new Date(new_date.getTime() - 1000 * 60 * 60 * 24).getDate(); //获取当月最后一天日期 } },
结果:
注意点:
let date=date1.getDate()
date1.setDate(1); date1.setMonth(date1.getMonth() + 1);
data1.setDate(date)
设置为下一个月,当下一个月当前日期没有时,即下月最大天数不够时,月份会往下多加一个月,此时需要先setDate(1),然后设置为下一个月,设置好月份之后再setDate(date)