如何在指定日期区间内动态获取每周一的时间范围?
获取指定时间段内每周指定星期几的时间范围
首先,你的原代码里的循环条件while (d.getMonth())其实是个bug(它会一直循环直到月份为0,也就是1月),这也是为什么只能获取到年底的原因。我帮你重构了函数,让它支持传入起始日期和结束日期,这样就能动态指定时间段了。
修改后的完整代码
enum DAYS { MON = 1, TUE, WED, THU, FRI, SAT, SUN } function getWeeklyDays(targetDay, startDateStr, endDateStr) { // 标准化日期:转为0点的Date对象,避免时间部分干扰 const normalizeDate = (dateStr) => { const date = new Date(dateStr); date.setHours(0, 0, 0, 0); return date; }; const start = normalizeDate(startDateStr); const end = normalizeDate(endDateStr); const days = []; // 找到起始日期之后的第一个目标星期几 const current = new Date(start); while (current.getDay() !== targetDay) { current.setDate(current.getDate() + 1); // 如果已经超过结束日期,直接返回空数组 if (current > end) return days; } // 循环添加每周的时间范围 while (current <= end) { const date = new Date(current); const startTimestamp = date.getTime(); // 修正时间戳计算:JavaScript时间戳是毫秒级,这里取当天23:59:59的时间戳 const endTimestamp = startTimestamp + 24 * 60 * 60 * 1000 - 1; days.push({ date: date.toISOString().split('T')[0], // 可选:转为YYYY-MM-DD格式字符串 start: startTimestamp, end: endTimestamp }); // 往后推7天 current.setDate(current.getDate() + 7); } return days; } // 测试:获取2019年6月14日至2020年6月13日的所有周一 const Mondays = getWeeklyDays(DAYS.MON, '2019-06-14', '2020-06-13'); console.log(Mondays);
关键改动说明
- 标准化日期:新增
normalizeDate函数,把传入的日期字符串转为0点的Date对象,避免因为时间部分(比如下午3点)导致的日期判断错误。 - 动态起止判断:循环条件改为
current <= end,确保只获取指定时间段内的日期。 - 修复时间戳计算:你原代码里的
end = start + 24 * 60 * 60少了*1000,JavaScript时间戳是毫秒级的,修正后能准确获取当天结束的时间戳。 - 边界处理:如果起始日期之后没有符合条件的星期几(比如起始日期是周日,目标是周一,但结束日期是当天),会直接返回空数组,避免无效循环。
使用方式
调用getWeeklyDays时只需传入三个参数:
- 目标星期几(比如
DAYS.MON) - 起始日期字符串(支持
YYYY-MM-DD等标准格式) - 结束日期字符串
这样就能灵活获取任意时间段内的指定星期几的时间范围了。
内容的提问来源于stack exchange,提问作者D1212
相关产品推荐
相关产品推荐

