Javascript 确定下一个工作日/工作日及节假日

Javascript 确定下一个工作日/工作日及节假日,javascript,arrays,function,loops,Javascript,Arrays,Function,Loops,我想确定下一个工作日/工作日,并考虑假期。对于工作日,我不包括周日和周六。对于假日,我将排除日期对象数组 我构建了一个do-while循环,至少增加一天,如果是周末或假日,则继续增加。虽然我的尝试有效,但我相信通过使用最新的node/ES语法特性,仍有很大的改进空间。注意,我仅限于任何版本的普通JavaScript,但最好使用现代功能(例如箭头函数和all) 我不包括周末的条件是: 函数下一个工作日(日期){ 做{ date.setDate(date.getDate()+1); }而(!(dat

我想确定下一个工作日/工作日,并考虑假期。对于工作日,我不包括周日和周六。对于假日,我将排除日期对象数组

我构建了一个do-while循环,至少增加一天,如果是周末或假日,则继续增加。虽然我的尝试有效,但我相信通过使用最新的node/ES语法特性,仍有很大的改进空间。注意,我仅限于任何版本的普通JavaScript,但最好使用现代功能(例如箭头函数和all)

我不包括周末的条件是:

函数下一个工作日(日期){
做{
date.setDate(date.getDate()+1);
}而(!(date.getDay()%6));
返回日期;
}
与排除节假日的尝试相结合的是:

const holidays=[新日期(2019,11,24),新日期(2019,11,25),新日期(2019,11,26),新日期(2019,11,31),新日期(2020,0,1)];
功能检查假日(假日、日期){
返回假期。部分(功能(假期日期){
返回日期.setHours(0,0,0,0)==holiday\u日期.setHours(0,0,0,0);
})
}
功能下一个工作日(日期){
做{
date.setDate(date.getDate()+1);
}while(选中假日(假日,日期)| |!(date.getDay()%6));
返回日期;
}
虽然这是可行的,但我确信它可以简化,并完全放弃单独的
checkHolidays
函数。我一直在努力实现,因为假日数组传递到函数中的
newdate()
的时间不同


如有任何进一步改进的建议,我们将不胜感激。谢谢您的时间。

您的代码看起来很好。如果你想使用包含,你可以考虑这个方法,因为假日数组是由你定义的。
const holidays=['2019-12-24', '2019-12-25']; //etc
然后你可以用

holidays.includes(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate());
这样,您的假日数组也更加“可读”

如果你真的想把它重构成一个函数,你可以尝试递归的方法

function nextWorkingDay(date){
   if(date.getDay() % 6 == 0 || holidays.includes(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate())){
      return nextWorkingDay (new Date(date.setDate(date.getDate()+1)));
   }else return date;
}
就我个人而言,虽然这种递归很酷,也很短,但我更喜欢您将这两者分开的原始风格。在一个大型项目中,你永远不知道什么时候你可能需要检查它是否是假日,而不管它是否是周日。在这种情况下,您的假日功能将可重用

注意:在移动设备上键入,代码未经测试。。但我希望你能明白

编辑: 从第二天开始: 或者在第二天调用上面的函数:p,或者调用下面修改过的函数

function nextWorkingDay(date){              
   date.setDate(date.getDate()+1);
   if(date.getDay() % 6 == 0 || holidays.includes(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate())){
      return nextWorkingDay (date);
   }else return date;
}

CodePen Fork:

一个演示我目前进度的函数,将结果直接记录到控制台。感谢您的建议,它看起来-因为我对递归函数相对较新,所以它非常简单(在您的手机上更令人印象深刻)!奇怪的是,从代码笔中可以看出,它没有返回任何正确的输出,只是返回了最初传入的日期。有什么想法吗?同样,它应该确定下一个工作日,而不是考虑当前的一天。这就是我最初选择DoWhile循环的原因;在这个递归函数中也有类似的可能吗?@Rick抱歉,我当时正在工作。哎呀。是的,我忘记了setDate返回的是一个数字而不是一个Date对象,所以我将答案修改为
nextWorkingDay(新日期(Date.setDate(Date.getDate()+1))。现在,它应该像预期的那样工作。至于下一个工作日,我已经修改了答案,将其包括在内!太棒了!相应地更新了代码笔,这使得和方法之间的比较很酷。再次感谢您的回复!