Вычислять дни, исключая выходные и праздничные дни в JavaScript

Pizush спросил: 28 марта 2018 в 03:38 в: javascript

Я пытаюсь написать код, в котором будут учитываться полные дни, за исключением выходных и праздничных дней, определенных пользователем. Я искал через stackoverflow и adobe forum, чтобы найти решение и пришел с ниже кода. Если праздничный день падает в рабочий день (суббота-среда), он исключается из расчета. Моя проблема в том, что если праздничные дни выпадают на выходные (четверг-пятница ), он вычитается для обоих (выходные и выходные). Предположим, что продолжительность отпуска составляет 18/09 / 2018-22 / 09/2018, общее количество 2 дней показывается вместо 3. Опять же, 17/10 / 2018-21 / 10/2018, общее число 1 день показывается вместо 3 дня. Любая помощь или любая идея для решения проблемы будет замечательной! С уважением

//Thursday and Friday will be excluded as weekend.
var start = this.getField("From").value;
// get the start date value
var end = this.getField("To").value;
var end = util.scand("dd/mm/yyyy H:MM:SS", end + " 0:00:00");
var start =util.scand("dd/mm/yyyy H:MM:SS", start + " 0:00:00");
event.value = dateDifference(start, end);
function dateDifference(start, end) {
  // Copy date objects so don't modify originals
  var s = new Date(+start);
  var e = new Date(+end);
  // Set time to midday to avoid daylight saving and browser quirks
  s.setHours(12,0,0,0);
  e.setHours(12,0,0,0);
  // Get the difference in whole days
  var totalDays = Math.round((e - s) / 8.64e7);
  // Get the difference in whole weeks
  var wholeWeeks = totalDays / 7 | 0;
  // Estimate business days as number of whole weeks * 5
  var days = wholeWeeks * 5;
  // If not even number of weeks, calc remaining weekend days
  if (totalDays % 7) {
    s.setDate(s.getDate() + wholeWeeks * 7);
    while (s < e) {
      s.setDate(s.getDate() + 1);
      // If day isn't a Thursday or Friday, add to business days
      if (s.getDay() != 4 && s.getDay() != 5) {
        ++days;
      }
    }
  }
var hdayar = ["2018/02/21","2018/03/17","2018/03/26","2018/04/14","2018/05/01","2018/08/15","2018/09/2 1","2018/10/18","2018/10/19","2018/12/16","2018/12/25"];
//test for public holidays
var phdays = 0;
for (var i = 0; i <hdayar.length; i++){
if ((Date.parse(hdayar[i]) >= Date.parse(start)) && (Date.parse(hdayar[i]) <= Date.parse(end))) {phdays ++;}}
  return days-phdays + 1;
}

1 ответ

Есть решение
Stuart ответил: 28 марта 2018 в 04:17

Вы должны использовать библиотеку для этого, а не изобретать велосипед.

Но если вы хотите сделать это самостоятельно, вы можете использовать .getDay, чтобы проверить, не выходят ли государственные праздники на выходные дни.

var weekend = [4, 5],   // for Thursday, Friday
    holDate, holDay;
for (var i = 0; i < hdayar.length; i++){
    holDate = Date.parse(hdayar[i]);
    holDay = new Date(holDate).getDay()
    if (weekend.indexOf(holDay) == -1 && holDate >= Date.parse(start) && holDate <= Date.parse(end)) {
        phdays ++;
    }
}

phdays теперь будет содержать число выходных, кроме выходных, в пределах диапазона.

Pizush ответил: 28 марта 2018 в 05:37
Это сработало!!!!!. Спасибо за помощь
Pizush ответил: 01 апреля 2018 в 11:40
Привет, я всегда получаю 1 в поле расчета, когда в start & нет ввода конечное поле. Если я уберу 1 из возвратов days-phdays + 1, тогда результат будет показывать ноль вместо 1 дня, когда начальный и конечный день совпадают. Есть идеи
Stuart ответил: 01 апреля 2018 в 08:35
Какой ответ вы хотите, когда нет ввода? Просто обработать это как ошибку или особый случай?