Когда-то тоже разыскивал, ничего дельного не нашел. Оказалось, что написать всю логику самому - не такое уж большое дело. Скину Java-исходники пары методов, надеюсь, поможет понять направление. Исходники под GWT, надо будет заменить DateTimeFormat на SimpleDateFormat и переделать plusDays()...
/**
* Метод проверяет, является ли указанная дата выходным днем, или праздничным днем. Также осуществляется
* проверка - является ли указанная дата выходным днем, указанным как рабочий день (постановлением Правительства)
* @param date проверяемая дата
* @return признак, является ли указанная дата рабочим днем
*/
public boolean isWorkingDay(Date date) {
String dayOfWeek = DateTimeFormat.getFormat("EEE").format(date);
String dateStr = DateTimeFormat.getFormat("yyyy-MM-dd").format(date);
return (!dayOfWeek.startsWith("Sat") && !dayOfWeek.startsWith("Sun")
&& !holidays.contains(dateStr))
||
workWeekends.contains(dateStr);
}
/**
* Метод осуществляет проверку, является ли указанная дата выходным днем, и если да, то переносит дату на
* следующий после выходных рабочий день.
* @param date проверяемая дата
* @return исходная дата либо дата первого рабочего дня после выходных
*/
public Date getBusinessDate(Date date) {
while (true) {
if (isWorkingDay(date)) {
return date;
} else {
date = plusDays(date, 1);
}
}
}
/**
* Метод осуществляет расчет указанного количества рабочих дней, которые должны истечь с момента указанной
* начальной даты, и возвращает дату наступления искомого срока
* @param date начальная дата, относительно которой осуществляется расчет
* @param days количество рабочих дней, которые должны пройти относительно начальной даты
* @return искомая дата
*/
public Date addBusinessDays(Date date, int days) {
for (int i = 1; i < days; i++) {
date = plusDays(date, 1);
if (!isWorkingDay(date)) {
days++;
}
}
return date;
}
public static Date plusDays(Date date, int days) {
Date clone = new Date(date.getTime());
clone.setDate(date.getDate() + days);
return clone;
}
workWeekends и holidays - HashSet-ы, читаются из БД, а в БД заполняются админом Системы на каждый год. workWeekends - рабочие дни вместо выходных, holidays - выходные дни вместо рабочих.
Остальное додумаете сами...