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
相关产品推荐
相关产品推荐

