Đây là một số mã tôi sử dụng. dtDateTimes
có thể chứa các ngày nghỉ được xác định trước của bạn (ví dụ: Ngày lễ Ngân hàng Vương quốc Anh) và dtConstants
có thể chứa những thứ định kỳ bạn muốn đối sánh, như 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;
}
Đánh dấu là câu trả lời được chấp nhận, bởi vì đó là sự thật. Theo các nghiên cứu của tôi, không có giải pháp đơn giản. Và Jodatime chắc chắn hữu ích. – picca