Когда дело касается праздников, на самом деле есть только один вариант: один день за один раз. Вы должны выполнять итерацию, один день за раз, и добавлять / вычитать по мере необходимости, если день «считается». В псевдокоде:
date add(date startDate, int daysToAdd) {
int i:=0
endDate:=startDate
while (i<daysToAdd) {
endDate++
if ( NOT(isWeekend(endDate))
AND NOT(isHoliday(endDate)) {
i++
}
}
return endDate
}
isWeekend()
тривиально реализовать; isHoliday()
, с другой стороны, очень крепкий орешек. Самый простой способ справиться с этим - иметь таблицу известных праздников и проверить, совпадает ли дата, переданная в качестве параметра, с любым из них. На мой взгляд, лучше иметь метод, основанный на правилах, который может вычислить, является ли данная дата праздником или нет.