如何将日期数组按周分组(周始于周一、终于周日)?
按周(周一至周日)分组日期数组的实现方案
核心思路
- 将数组中的字符串日期转换为可计算的
Date对象,注意处理dd/mm/yyyy格式的月份偏移(JavaScript中月份从0开始计数)。 - 为每个日期生成周标识:以周一为一周起始,通过计算该日期与当年第一个周一的天数差,确定所属周数。
- 依据周标识对日期分组,最后将分组后的日期转回原字符串格式。
JavaScript实现代码
// 原始日期数组 const dateArray = ["11/5/2023", "12/5/2023", "13/5/2023", "14/5/2023", "15/5/2023", "16/5/2023", "17/5/2023", "18/5/2023", "19/5/2023", "20/5/2023", "21/5/2023", "22/5/2023", "23/5/2023", "24/5/2023", "25/5/2023", "26/5/2023", "27/5/2023", "28/5/2023", "29/5/2023", "30/5/2023", "31/5/2023", "1/6/2023", "2/6/2023", "3/6/2023", "4/6/2023", "5/6/2023", "6/6/2023", "7/6/2023", "8/6/2023", "9/6/2023", "10/6/2023", "11/6/2023", "12/6/2023", "13/6/2023", "14/6/2023", "15/6/2023", "16/6/2023", "17/6/2023", "18/6/2023", "19/6/2023", "20/6/2023", "21/6/2023", "22/6/2023", "23/6/2023", "24/6/2023", "25/6/2023", "26/6/2023", "27/6/2023", "28/6/2023", "29/6/2023", "30/6/2023", "1/7/2023", "2/7/2023", "3/7/2023", "4/7/2023"]; // 转换dd/mm/yyyy字符串为Date对象 function parseDate(dateStr) { const [day, month, year] = dateStr.split('/').map(Number); return new Date(year, month - 1, day); } // 计算日期所属周数(周一为一周起始) function getWeekNumber(date) { const startOfYear = new Date(date.getFullYear(), 0, 1); // 定位当年第一个周一 const firstMonday = startOfYear.getDay() === 1 ? startOfYear : new Date(startOfYear.setDate(startOfYear.getDate() + (1 - startOfYear.getDay() + 7) % 7)); // 计算当前日期与第一个周一的天数差 const dayDiff = Math.floor((date - firstMonday) / (1000 * 60 * 60 * 24)); // 周数从0开始计数,可根据需求调整为从1开始 return Math.floor(dayDiff / 7); } // 按周分组日期数组 function groupDatesByWeek(dateArr) { const groups = {}; dateArr.forEach(dateStr => { const date = parseDate(dateStr); const weekNum = getWeekNumber(date); if (!groups[weekNum]) { groups[weekNum] = []; } groups[weekNum].push(dateStr); }); // 将分组结果转为有序数组 return Object.values(groups); } // 执行分组并输出结果 const groupedDates = groupDatesByWeek(dateArray); console.log(groupedDates);
代码说明
parseDate:处理dd/mm/yyyy格式的字符串,转换为JavaScript原生Date对象,修正月份索引偏移问题。getWeekNumber:通过定位当年第一个周一,计算当前日期与该基准日的天数差,得到唯一的周标识,确保周一为一周起始。groupDatesByWeek:以周数为键存储对应日期,最后将对象值转为数组,得到按周有序分组的结果。
内容的提问来源于stack exchange,提问作者ArUn GuPta
相关产品推荐
相关产品推荐

