I would like to calculate end date (and time) of an event. I know starting date and duration (in minutes). But:
First you have to define "holidays". Not every locale has the same ones, so this has to be made generic and pluggable.
I don't think it's "simple".
Have you looked into Holiday calculation project? it is featured in the Related projects from jodatime and could be useful
Here's some code I use. dtDateTimes
can contain your pre-defined holiday dates (e.g. UK Bank Holidays) and dtConstants
can contain recurring things you'd like to match against, like DateTimeConstants.SATURDAY
.
/**
* Returns a tick for each of
* the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code>
* occurring in the period as represented by begin -> end.
*
* @param begin
* @param end
* @param dtConstants
* @param dtDateTimes
* @return
*/
public int numberOfOccurrencesInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) {
int counter = 0;
for (DateTime current = begin; current.isBefore(end); current = current.plusDays(1)) {
for (Integer constant : dtConstants) {
if (current.dayOfWeek().get() == constant.intValue()) {
counter++;
}
}
for (DateTime dt : dtDateTimes) {
if (current.getDayOfWeek() == (dt.getDayOfWeek())) {
counter++;
}
}
}
return counter;
}
/**
* Returns true if the period as represented by begin -> end contains any one of
* the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code>
*
* @param begin
* @param end
* @param dtConstants
* @param dtDateTimes
*/
public boolean isInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) {
return numberOfOccurrencesInPeriod(begin, end, dtConstants, dtDateTimes) > 0;
}
Jodatime will help you -a lot I'd say-, but you'll need to write the logic yourself, a loop skipping some entire days and some times of the day. Not very simple, neither very complex, it seems to me.