【问题标题】:Determine next working/business day with holidays确定下一个有节假日的工作日/工作日
【发布时间】:2019-10-29 11:03:45
【问题描述】:

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

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

我排除周末的条件是:

function nextWorkingDay(date) {
  do {
    date.setDate(date.getDate() + 1);
  } while (!(date.getDay() % 6));
  return date;
}

结合排除节假日的尝试是:

const holidays = [new Date(2019, 11, 24), new Date(2019, 11, 25), new Date(2019, 11, 26), new Date(2019, 11, 31), new Date(2020, 0, 1)];

function checkHolidays(holidays, date) {
  return holidays.some(function (holiday_date) {
    return date.setHours(0, 0, 0, 0) === holiday_date.setHours(0, 0, 0, 0);
  })
}

function nextWorkingDay(date) {
  do {
    date.setDate(date.getDate() + 1);
  } while (checkHolidays(holidays, date) || !(date.getDay() % 6));
  return date;
}

虽然这可行,但我确信它可以被简化并完全放弃单独的 checkHolidays 函数。我一直在努力实现.includes(),因为假期数组与传递给函数的new Date() 的时间不同。

任何进一步改进的建议/建议将不胜感激。感谢您的宝贵时间。

【问题讨论】:

标签: javascript arrays function loops


【解决方案1】:

您的代码看起来不错。如果你想使用包含,你可以考虑这种方法,因为假期数组是你定义的。

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 分叉:https://codepen.io/peekolo/pen/RwwLKYX?editors=0012

【讨论】:

  • 感谢您的建议,它看起来像 much cleaner already - 因为我对递归函数比较陌生,所以这很令人迷惑(从您的手机上看更令人印象深刻)!奇怪的是,从 CodePen 中可以看出,它没有返回任何正确的输出,只是最初传入的任何日期。有什么想法吗?
  • 另外,它应该确定下一个工作日,而不是考虑当天。这就是我最初选择 do-while 循环的原因;在这个递归函数中是否同样可能?
  • @Rick 对不起,我在工作。哎呀。是的,我忘记了 setDate 返回的是数字而不是日期对象,所以我将答案修改为 nextWorkingDay (new Date(date.setDate(date.getDate()+1)));。现在它应该按预期工作。至于下一个工作日,我已经修改了答案,包括这个!
  • 太棒了!相应地更新了 CodePen,这对 recursiveiterative 方法进行了很好的比较。再次感谢您的回复!
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2018-09-09
  • 1970-01-01
  • 2011-07-28
  • 2017-09-14
  • 1970-01-01
相关资源
最近更新 更多