Java 8 中如何两个给定日期之间的工作日数

工作日被视为所有工作日,不包括工作日的所有假期。

Java 8 使用 Stream.iterate()计算工作日
要获取工作日计数,我们首先使用 ChronoUnit.DAYS.between() 方法获取两个日期之间的总天数 (daysBetween)。

然后我们得到一个从开始日期到结束日期的日期流,直到我们达到“daysBetween”限制。
此外,我们根据我们的两个谓词 isHolidayisWeekend检查每个日期。

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