按周一至周日统计日期周数差的JavaScript函数问题排查
问题分析
你当前的函数问题出在一周起始日的定义错误:你的weekStart函数把周日(getDay()返回0)当作一周的起始,但你需要的是周一到周日为一周,也就是一周的起始应该是周一。这就导致当结束日期是周日时,会被错误归类到下一周,从而多统计一周。
比如测试用例中:
- 2022-11-23是周三(
getDay()=3),原weekStart返回的是2022-11-20(上周日) - 2022-11-27是周日(
getDay()=0),原weekStart返回的是2022-11-27(当天)
两者时间差为7天,除以周毫秒数得1,Math.ceil(1)=1,加1后得到2,这就是错误的根源。
修正方案
首先调整weekStart函数,将一周的起始改为周一,然后修正weeksBetween的计算逻辑:
const weekMs = 7 * 24 * 60 * 60 * 1000; const dayMs = 24 * 60 * 60 * 1000; // 获取日期所在周的周一(0点) function getWeekStart(date) { const dayOfWeek = date.getDay(); // 周日(dayOfWeek=0)需要减去6天得到周一;周一到周六减去(dayOfWeek-1)天 const daysToSubtract = dayOfWeek === 0 ? 6 : dayOfWeek - 1; return new Date(date.getTime() - daysToSubtract * dayMs); } function weeksBetween(startDate, endDate) { const startWeek = getWeekStart(startDate); const endWeek = getWeekStart(endDate); // 计算两个周起始的差值,除以周毫秒数得到周数差,再加1(因为起始周算第1周) const weekDiff = Math.floor((endWeek - startWeek) / weekMs) + 1; // 确保结果至少为1(当起始和结束在同一周时) return Math.max(weekDiff, 1); } // 测试用例:2022-11-23 到 2022-11-27(周日) console.log(weeksBetween(new Date("11/23/2022"), new Date("11/27/2022"))); // 输出1,符合预期 // 测试跨周:2022-11-23 到 2022-11-28(周一) console.log(weeksBetween(new Date("11/23/2022"), new Date("11/28/2022"))); // 输出2,符合预期
关键修正点说明
getWeekStart函数:- 对于周日(
getDay()=0),减去6天得到当前周的周一 - 对于周一到周六(
getDay()=1~6),减去dayOfWeek-1天得到周一
这样所有日期都会被映射到所在周的周一,保证一周的范围是周一到周日。
- 对于周日(
weeksBetween函数:- 使用
Math.floor替代Math.ceil,因为两个周起始的差值是整周数的倍数(比如同一周差值为0,跨一周差值为7天) - 加1是因为起始周本身要算第1周
- 用
Math.max(weekDiff, 1)确保当起始和结束日期在同一周时,结果始终为1,避免出现0的情况。
- 使用
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

