«Лучший» способ, конечно, зависит от контекста вашей реализации.
(1) Если у вас есть небольшое количество начальных дат, вы можете продолжить в том же духе.
for each startingDate
counter = 0
advanceDate = startingDate
do while counter < nOfBusinessDays
advanceDate = advanceDate.addDays(1) # whatever your environment provides for date arithmetic
if advanceDate is found in tableOfSundays # see (a) below
continue
if advanceDate is found in tableOfHolidays
continue
counter++
end do while
# advanceDate is nOfBusinessDays later than startingDate
end for each
(a) Если ваш арифметический пакет с датой предоставляетФункция дня недели, вы можете использовать ее для воскресного теста.
(2) Если у вас есть много начальных дат, которые нужно оценить, и / или вы будете вычислять ту же дату плюс-дни неоднократно, вы можете предварительно рассчитать карту рабочих дней.Карта будет охватывать промежуток времени между самой ранней датой начала в вашей таблице и самой поздней датой начала, плюс максимальное количество рабочих дней для подсчета и плюс любые промежуточные воскресенья и праздничные дни.Реализуйте карту как обычный массив в порядке возрастания даты.Тогда отсчет рабочих дней от начальной даты - это просто вопрос индексов массива.
(3) Вы можете реализовать гибридное решение, используя метод (1) для начала, а затем кэшировать ответы в методе (2).карта.(Это решает проблему границ того, как определить, каким должен быть последний день на карте.)