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

JavaScript递归日期调整函数异常问题求助

递归调整日期至非假日(周六、周日及美国公共假日)

我刚实现了一个JavaScript递归函数,用来解决日期调整的需求:如果给定的日期是周六、周日,或者美国公共假日,就自动把日期向后顺延一天,直到得到一个符合要求的工作日。我用到了Moment.js来处理日期操作,搭配moment-holiday.js来判断美国公共假日,完整的实现代码如下:

<!doctype html>
<script src="moment.js"></script>
<script src="moment-holiday.js"></script>
<script>
function CalcDueDate(dueDate) {
    // 将传入的日期解析为Moment对象,统一处理格式
    const currentDate = moment(dueDate);
    
    // 检查是否是周末:周日为0,周六为6
    const isWeekend = currentDate.day() === 0 || currentDate.day() === 6;
    // 检查是否是美国公共假日,moment-holiday内置了US地区的假日规则
    const isHoliday = currentDate.isHoliday('US');

    if (isWeekend || isHoliday) {
        // 顺延一天后递归调用,直到找到非假日日期
        return CalcDueDate(currentDate.add(1, 'day').format('YYYY-MM-DD'));
    } else {
        // 返回最终的有效日期,这里用YYYY-MM-DD格式,可按需调整
        return currentDate.format('YYYY-MM-DD');
    }
}

// 测试示例
console.log(CalcDueDate('2024-07-04')); // 美国独立日,顺延至下一个工作日
console.log(CalcDueDate('2024-11-28')); // 美国感恩节,顺延至11月29日
console.log(CalcDueDate('2024-09-01')); // 周日,顺延至9月2日周一
</script>

关键逻辑说明

  • 日期解析与操作:用moment(dueDate)把任意格式的日期字符串转换成Moment对象,方便后续的日期判断和修改。
  • 周末判断:通过currentDate.day()获取星期几,周日为0、周六为6,以此判断是否是周末。
  • 假日判断:依赖moment-holiday.js提供的isHoliday('US')方法,直接判断当前日期是否属于美国公共假日,这个库已经内置了美国的法定假日规则,不用自己手动维护。
  • 递归顺延:只要当前日期是周末或假日,就把日期加一天,然后递归调用自身,直到找到第一个非假日的工作日。

注意事项

  • 确保moment.js和moment-holiday.js的文件路径正确,且版本兼容(建议使用官方推荐的匹配版本)。
  • 如果需要支持其他国家/地区的假日,可以把isHoliday('US')中的'US'替换成对应的地区代码,比如'CA'(加拿大)、'GB'(英国)等,moment-holiday支持多个地区的假日规则。
  • 返回的日期格式可以根据业务需求调整,比如改成MM/DD/YYYY或者保留Moment对象直接返回,灵活调整即可。

内容的提问来源于stack exchange,提问作者Elang TA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:42:57