JavaScript实现排除周末的月度工作日对象数组生成及代码修复
解决当月工作日数组生成的周末跳过问题
看起来你遇到的问题是代码里跳过周末的逻辑没有生效,这是因为你在判断周末时错误地多次自增了index,导致星期几的对应关系完全混乱了。咱们一步步来修复这个问题:
原代码的问题分析
原代码里的这段判断逻辑是错误的根源:
if (daysInWeek[index++] == "Sunday" || daysInWeek[index++] == "Saturday") { continue; //I tried: no success. }
这里存在两个关键问题:
- 每次判断条件时,
index会被自增两次(一次在判断周日的分支,一次在判断周六的分支),导致index的数值和当前日期的星期完全不匹配。 - 手动维护
index来追踪星期几的方式本身就容易出错,不如直接利用Date对象的内置方法来获取当天的星期,逻辑更可靠。
修正后的代码
我们可以直接通过Date对象的getDay()方法判断当天是否是周末(getDay()返回0表示周日,6表示周六),同时还做了一些额外优化,让代码更健壮:
function getDaysArray(year, month) { const numDaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // 处理闰年的2月天数 if (month === 2 && ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0)) { numDaysInMonth[1] = 29; } const daysArray = []; for (let i = 1; i <= numDaysInMonth[month - 1]; i++) { const currentDate = new Date(year, month - 1, i); const dayOfWeek = currentDate.getDay(); // 跳过周日(0)和周六(6) if (dayOfWeek === 0 || dayOfWeek === 6) { continue; } // 格式化日期为标准YYYY-MM-DD格式,避免单数字的月/日问题 const formattedMonth = String(month).padStart(2, '0'); const formattedDay = String(i).padStart(2, '0'); daysArray.push({ "title": "Turn", "resourceid": "4", "start": `${year}-${formattedMonth}-${formattedDay}T08:00:00`, "end": `${year}-${formattedMonth}-${formattedDay}T14:00:00`, "internals": ground[i - 1] // 注意数组索引修正:i从1开始,所以取i-1 }); } return daysArray; } // 示例调用 console.log(getDaysArray(2019, 12));
额外优化说明
- 闰年处理:原代码没有考虑闰年的2月,修正后添加了闰年判断,确保2月天数准确。
- 日期格式化:用
padStart(2, '0')保证月、日都是两位数,符合ISO日期规范(比如2019-12-01而非2019-12-1)。 - 数组索引修正:原代码中
ground[i]会导致索引越界,修正为ground[i-1](因为循环里i从1开始)。 - 语法规范:用
const/let替代var,符合现代JavaScript语法,避免变量提升问题。
这样修改后,就能正确跳过周六和周日,只生成工作日的对象数组了。
内容的提问来源于stack exchange,提问作者sundsx
相关产品推荐
相关产品推荐

