工作日被视为所有工作日,不包括工作日的所有假期。
Java 8 使用 Stream.iterate()计算工作日
要获取工作日计数,我们首先使用 ChronoUnit.DAYS.between() 方法获取两个日期之间的总天数 (daysBetween
)。
然后我们得到一个从开始日期到结束日期的日期流,直到我们达到“daysBetween”限制。
此外,我们根据我们的两个谓词 isHoliday
和 isWeekend
检查每个日期。
private static List<LocalDate> countBusinessDaysBetween_Java8(final LocalDate startDate, final LocalDate endDate, final Optional<List<LocalDate>> holidays) { // Validate method arguments if (startDate == null || endDate == null) { throw new IllegalArgumentException("Invalid method argument(s) to countBusinessDaysBetween (" + startDate + "," + endDate + "," + holidays + ")"); } // Predicate 1: 检查是否为假期 Predicate<LocalDate> isHoliday = date -> holidays.isPresent() && holidays.get().contains(date); // Predicate 2: 检查是否为工作日 Predicate<LocalDate> isWeekend = date -> date.getDayOfWeek() == DayOfWeek.SATURDAY || date.getDayOfWeek() == DayOfWeek.SUNDAY; // 获取两个日期之间的所有天数 long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); // 迭代所有日期的流,并检查每天是否为工作日或者假日 return Stream.iterate(startDate, date -> date.plusDays(1)) .limit(daysBetween) .filter(isHoliday.or(isWeekend).negate()) .collect(Collectors.toList()); }
日期:2020-09-17 00:09:46 来源:oir作者:oir