Определить следующий рабочий / рабочий день с выходными - PullRequest
0 голосов
/ 29 октября 2019

Я бы хотел определить следующий рабочий / рабочий день и учесть праздники. В рабочие дни я исключаю воскресенья и субботы. Для праздников я исключаю массив объектов даты.

Я структурировал цикл 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().

Любые советы / предложения по дальнейшему улучшению были бы чрезвычайнооценили. Спасибо за ваше время.

1 Ответ

0 голосов
/ 29 октября 2019

Ваш код выглядит просто отлично. Если вы хотите использовать include, вы можете рассмотреть этот подход, так как массив праздничных дней определяется вами.

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

...