Я думаю, что Олег предлагал взглянуть на то, как jBPM реализует эту функциональность для вдохновения в разработку собственного решения. Ниже мой ответ заимствован из источника, который я нашел, выполнив Поиск кода Google .
Это не принимает во внимание праздники, но я оставлю это как упражнение для вас. Могу ли я предложить использовать веб-сервис для ежегодного обновления списка ограниченных дат? Удачи!
int fromHour = 9;
int fromMinute = 0;
int toHour = 17;
int toMinute = 0;
long maxResponseTime = 16;
Date calculateResponseTime(Date issueReportedAt, long responseHours) {
Date end = null;
Calendar responseTime = Calendar.getInstance();
responseTime.setTime(issueReportedAt);
int hourOfDay = responseTime.get(Calendar.HOUR_OF_DAY);
int dayOfWeek = responseTime.get(Calendar.DAY_OF_WEEK);
if (hourOfDay < fromHour) {
responseTime.set(Calendar.HOUR, fromHour);
}
if (hourOfDay >= toHour || dayOfWeek == 1) {
responseTime.add(Calendar.DATE, 1);
responseTime.set(Calendar.HOUR_OF_DAY, fromHour);
responseTime.set(Calendar.MINUTE, fromMinute);
} else if (dayOfWeek == 7) {
responseTime.add(Calendar.DATE, 2);
responseTime.set(Calendar.HOUR_OF_DAY, fromHour);
responseTime.set(Calendar.MINUTE, fromMinute);
}
int hour = responseTime.get(Calendar.HOUR_OF_DAY);
int minute = responseTime.get(Calendar.MINUTE);
long dateMilliseconds = ((hour * 60) + minute) * 60 * 1000;
long dayPartEndMilleseconds = ((toHour * 60) + toMinute) * 60 * 1000;
long millisecondsInThisDayPart = dayPartEndMilleseconds
- dateMilliseconds;
long durationMilliseconds = responseHours * 60 * 60 * 1000;
if (durationMilliseconds < millisecondsInThisDayPart) {
end = new Date(responseTime.getTimeInMillis()
+ durationMilliseconds);
} else {
long remainder = (durationMilliseconds - millisecondsInThisDayPart) / 60 / 60 / 1000;
Date dayPartEndDate = new Date(responseTime.getTimeInMillis()
+ durationMilliseconds);
responseTime.setTime(dayPartEndDate);
end = calculateResponseTime(responseTime.getTime(), remainder);
}
return end;
}
@Test
public void testCalculateResponseTime() {
Calendar issueReportedAt = Calendar.getInstance();
Calendar expectedResponseTime = Calendar.getInstance();
issueReportedAt.set(2011, 8, 19, 13, 0, 0);
expectedResponseTime.set(2011, 8, 21, 13, 0, 0);
assertTrue(expectedResponseTime.getTime().equals(
calculateResponseTime(issueReportedAt.getTime(),
maxResponseTime)));
issueReportedAt.set(2011, 8, 19, 18, 5, 0);
expectedResponseTime.set(2011, 8, 22, 9, 0, 0);
assertTrue(expectedResponseTime.getTime().equals(
calculateResponseTime(issueReportedAt.getTime(),
maxResponseTime)));
issueReportedAt.set(2011, 8, 23, 14, 0, 0);
expectedResponseTime.set(2011, 8, 27, 14, 0, 0);
assertTrue(expectedResponseTime.getTime().equals(
calculateResponseTime(issueReportedAt.getTime(),
maxResponseTime)));
}