You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:12:38