Pull to refresh

Считаем рабочие дни с Moment.js

Reading time 2 min
Views 18K
Несколько месяцев назад я опубликовал плагин к Moment.js позволяющий рассчитать: сколько это N рабочих дней от сегодня в календарных днях? какая дата будет спустя N рабочих дней от заданной даты? сколько рабочих дней в заданном диапазоне? Возможность сконфигурировать рабочие дни и исключения в виде праздников — имеется.

Плагин можно найти на github: https://github.com/andruhon/moment-weekday-calc

Плагин можно установить через bower и npm:
bower install moment-weekday-calc

npm install moment-weekday-calc

Плагин добавляет несколько функций в Moment.js:
  • int weekdayCalc — считает сколько «рабочих» дней в заданном диапазоне
  • date addWorkdays — находит дату спустя N «рабочих» (пн-пт) дней
  • int workdaysToCalendarDays — конвертирует рабочие дни в календарные
  • date addWeekdaysFromSet — добавляет дни из заданного множества к заданной дате
  • int weekdaysFromSetToCalendarDays — конвертирует дни из заданного множетсва в календартные дни

Каждая из функций доступна с префиксом iso, такие функции используют множество рабочих дней начинающееся с понедельника (1-7), функции без префикса используют американский формат начинающийся с воскресенья (0-6).

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

Использование:
Привожу примеры только для функций с префиксом iso.

Сколько пятниц между 14 и 23 февраля?
moment('14 Feb 2014').isoWeekdayCalc('23 Feb 2014',[5]); //2  
(в данном случае начало диапазона берётся из объекта moment, из которого мы вызываем функцию)

Сколько рабочих дней, без учёта праздников в с 1 апреля 2015 года по 31 марта 2016?
moment().isoWeekdayCalc('1 Apr 2015','31 Mar 2016',[1,2,3,4,5]); //262  
(здесь объект moment не содержит даты, поэтому начальная дата задаётся в качестве первого аргумента)

А если учесть пару праздников?
moment().isoWeekdayCalc('1 Apr 2015','31 Mar 2016',[1,2,3,4,5],['6 Apr 2015','7 Apr 2015']); //260 

Вызов с объектом:
moment().isoWeekdayCalc({  
  rangeStart: '1 Apr 2015',  
  rangeEnd: '31 Mar 2016',  
  weekdays: [1,2,3,4,5],  
  exclusions: ['6 Apr 2015','7 Apr 2015']  
}) //260

Что за дата будет спустя 5 рабочих дней после 2 февраля, если работать без выходных?
moment('2015-02-02').isoAddWeekdaysFromSet(5, [1,2,3,4,5,7]); //2015-02-08

5 рабочих дней после 4 мая, с учётом 9го мая?
moment('2015-05-04').isoAddWeekdaysFromSet({  
  'workdays': 5,  
  'weekdays': [1,2,3,4,5,6],  
  'exclusions': ['2015-05-09']  
}); //2015-05-11 

11 рабочих дней после 10 октября в календарных днях, рабочие дни — среда-воскресенье:
moment('2015-10-05').isoWeekdaysFromSetToCalendarDays(11, [3,4,5,6,7], ['2015-10-15']) //17

Подробнее в README на гитхабе.

Заранее спасибо за здравую критику. Надеюсь, что плагин будет кому-нибудь полезен.
Tags:
Hubs:
+20
Comments 21
Comments Comments 21

Articles