JavaScript工作日计算函数返回错误天数,Nov20-Nov22结果为2而非3求助
你的11月20日至11月22日统计天数为2而非3的问题,大概率由以下几个原因导致,可逐一排查:
1. 时区引发的日期偏移
使用new Date("YYYY-MM-DD")创建日期时,浏览器会基于本地时区解析字符串。例如若你的时区是UTC+8,new Date("2024-11-22")对应的UTC时间是2024-11-21T16:00:00,此时如果dDate1是本地时间的2024-11-22T00:00:00,dDate2是UTC转换后的2024-11-21T16:00:00,循环条件dDate1 <= dDate2会不成立,直接跳过最后一天的统计。
解决办法:改用UTC时间创建日期,彻底规避时区干扰:
// 替换日期解析逻辑 function parseDate(dateStr) { const [mm, dd, yyyy] = dateStr.split('/'); // 基于UTC创建日期,确保日期部分绝对准确 return new Date(Date.UTC(yyyy, mm - 1, dd)); } // 在calcBusinessDays中调用 let dDate1 = parseDate(startDate); let dDate2 = parseDate(endDate);
同时修改addDay方法,统一用UTC操作日期:
Date.prototype.addDay = function(days) { const date = new Date(this.valueOf()); date.setUTCDate(date.getUTCDate() + days); return date; }
2. 星期数匹配逻辑错误
你的代码用(dDate1.getDay() + 1).toString()获取星期数,但Date.getDay()的返回规则是:0=周日,1=周一,2=周二…6=周六。如果你的WorkingDays配置的是周一到周五对应1-5,那么+1会导致周一被识别为2、周五被识别为6,若aWD数组中没有包含这些数值,对应日期会被误判为非工作日。
验证方式:在循环中打印关键值,确认工作日判断是否正确:
console.log(`${tempDate} 星期数:${dayOfWeek},是否为工作日:${isWworkingDay}`);
如果匹配错误,调整星期数计算逻辑:
// 若WorkingDays的数值是1=周一、5=周五,直接使用getDay()的结果 var dayOfWeek = dDate1.getDay().toString(); // 注意:此时周日是0、周六是6,需确保aWD数组不包含这两个值
3. 节假日数组误排除目标日期
检查aHolidayDate数组是否包含11月20-22日中的某一天。比如数组里有"11/20/2024",该日期会被排除,直接导致统计数减少1。
验证方式:在循环中打印节假日判断结果:
console.log(`${tempDate} 是否在节假日列表:${aHolidayDate.indexOf(tempDate) !== -1}`);
4. 日期转换函数依赖的全局变量格式不匹配
dConvert函数依赖全局的dateFormat变量,如果dateFormat的格式与输入日期不匹配(比如输入是mm/dd/yyyy,但dateFormat是dd/mm/yy),会导致转换后的日期完全错误,进而影响整个统计逻辑。
验证方式:打印转换后的日期,确认格式正确:
console.log("转换后的开始日期:", dConvert(startDate)); console.log("转换后的结束日期:", dConvert(endDate));
内容的提问来源于stack exchange,提问作者Smith Jonas

