2015-07-06 1 views
1

У меня проблемы. Я хочу знать конечную дату с определенной даты, используя momentjs, увеличивая определенное количество дней и исключая дни недели из массива.добавить дни блокировки дней недели из массива Momentjs

Пример:

У меня дату '2015-07-05'. Я хочу добавить 8 дней для этой даты. Поэтому моя последняя дата - «2015-07-09».

Но я хочу исключить несколько дней недели, которые у меня есть в этом массиве: [1,5,6,7] (соответствует «понедельникам», «пятницам», «субботам» и «воскресным» в формате ISO).

После исключения этих дней недели моя окончательная дата должна быть «2015-07-21» в конце. Но я не могу понять, как его решить.

Это функция, предназначенная для исключения субботы и воскресенья. Но я не могу приспособить его к моему сценарию.

getFinalDate: function(date, days, excluded){ 
      var increment = days/Math.abs(days); 
      var addition = Math.ceil(Math.abs(days)/5) * 7 * increment; 
      var date = moment(date).add(addition, 'days'); 
      var remaining = days % 5; 

      var date = moment(date).add(addition, 'days'); 

      while(remaining != 0) { 
       date.add(increment, 'days'); 
       if($.inArray(date.isoWeekday(), excluded) == -1) 
        remaining -= increment; 
      } 

      return date.format('YYYY-MM-DD'); 

     } 

вышеуказанная функция была взята из другой публикации. Он работает отлично, но мне нужно исключить массив недельных дней.

ответ

1

Я отредактировал функцию для вас с немного более простой логикой.

Вот код:

function getFinalDate(date, days, excluded) { 
    var increment = days/Math.abs(days), 
     i = 1, 
     date = moment(date); 
    excluded = excluded || []; 
    do { 
     date.add(increment, 'days'); 
     if (excluded.indexOf(date.isoWeekday()) === -1) { 
      i++; 
     } 
    } while (i < Math.abs(days)); 
    return date.format('YYYY-MM-DD'); 
} 

Идея заключается в том, что вы продолжаете добавляя или вычитая 1 день, пока вы не сделали больше, чем указанное количество days. Если после добавления или вычитания дня значение isoWeekday() указано в списке исключенных дней, не считайте это одним из n дней.

В этом случае может возникнуть ошибка «один за другим», вам нужно будет тщательно протестировать его, но это должно привести вас к правильному пути.

+0

Большое спасибо @GregL. Я собираюсь проверить это, но вся ваша логика кажется правильной. – Brian

+0

Работает отлично, спасибо много снова !! – Brian

Смежные вопросы