function get42ArrayDate(year, month){
// month 是正常月份
let now = year && month? new Date(year, month -1 ) : new Date();
let _year = now.getFullYear();
let _month = now.getMonth(); // Date 的月份比正常的月份小 1
let firstDayDateObj = new Date(_year, _month, 1); // 当月第一天日期
let _day = firstDayDateObj.getDay() == 0 ? 7 : firstDayDateObj.getDay(); // 修正一下星期的日期,当为 0 的时候说明为星期天
let needFillDayCount = _day - 1; // 我们需要补的日期, 当我们一号为星期天的时候,也就是 _date 为 7,则我们需要把星期一到星期六的天数给补完
let prevMonthLastDayDateObj = new Date(_year, _month, 0); // 上一个月最后一天的日期
let currentMonthLastDayDateObj = new Date(_year, _month + 1, 0); // 当前月最后一天的日期
let arr = Array.from({length:42}, (v, k) => k - needFillDayCount + 1 ) ; // 需要填充的数组 0 - 41 = 42 位 再加 1 是为了让 K 从 1开始
console.log(arr);
let ret_arrObj = arr.map((val, index) => {
// 现在我们对 负数日期,和超出限定的日期进行修正处理
// 我们留下这个负数和超出的是为了让其他地方也可以使用这些数据通过 Date 直接构造正确的日期
// 首先修正负数, 并且把正确的放在一个对象里面
let prevMonthLastDay = prevMonthLastDayDateObj.getDate(); // 上个月最后一天的日期
let currentMonthLastDay = currentMonthLastDayDateObj.getDate(); // 当前月最后一天
let ret_obj = {
index: val
};
if( val <= 0 ){
// 对负数日期进行修正
ret_obj.showDate = prevMonthLastDay + val; // 此时的 val 是一个负数,当 -0 的时候就是上月最后一天, - 1就是倒数第二天,以此类推。
ret_obj.showMonth = _month; // showMonth 顾名思义应该为我们所理解的月份,也就是从1开始的,而 _month 是从 0 开始的,所以我们应该 + 1, 而这里是上个月的,所以要 -1 所以刚好抵消
}else if (val > currentMonthLastDay){
// 对超出日期进行修正
ret_obj.showDate = val - currentMonthLastDay ; // 此时的 val 是超出正常日期的,我们让这个数减去单月的最后一天的值,相当于我们此时重新开始从 1 开始计数。 32 - 31 为 1号。 33 -31 为 2号, 以此类推。
ret_obj.showMonth = _month + 2;
}else{
// 正常的本月日期
ret_obj.showDate = val;
ret_obj.showMonth = _month + 1;
}
return ret_obj;
});
return {
currentMonth: _month + 1,
currentYear: _year,
dateArray: ret_arrObj
}
}
console.dir(get42ArrayDate());