js-获取日期在月的第几周,和周的所属月份

80 阅读1分钟
   /**
 * @param {Date | String} date 传入的需要计算的日期
 * @param {Number} preNum 日期所在周是否属于当前所在月,0 表示是;1表示否,属于上一个月
 * @returns 
 */
function getWeekOfMonth(date, preNum = 0) {
    date = date && new Date(date);
    // 获取日期所在月份的第一天
    const firstDayOfMonth = new Date(date.getFullYear(), date.getMonth() - preNum, 1);
    // 获取第一天是周几,1代表周一... 7代表周日,若不为1说明本月第一天所在周属于上个月,下周为本月第一周
    let dayOfWeekNum = firstDayOfMonth.getDay();
    dayOfWeekNum === 0 && (dayOfWeekNum = 7);
    // 获取每月第一周周一的日期
    const firstMondayOfMonth = dayOfWeekNum === 1 ? firstDayOfMonth : new Date(firstDayOfMonth.getTime() + (8 - dayOfWeekNum) * 24 * 60 * 60 * 1000);
    const diffNum = (date.getTime() - firstMondayOfMonth.getTime()) / (24 * 60 * 60 * 1000 * 7);
    // 与本月第一周周一日期比较,若为负值,说明此周属于上月的最后一周
    if (diffNum > -1 && diffNum < 0) {
        getWeekOfMonth(date, 1);
        return;
    }
    return {
        month: firstDayOfMonth.getMonth() + 1,
        weekOfMonth: Math.floor(diffNum) + 1
    }
}