通过指定时间范围获取工作日天数
public Result getWorkingDayRange(String startDate, String endDate) {
Calendar cl1 = Calendar.getInstance();
Calendar cl2 = Calendar.getInstance();
try {
cl1.setTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD, startDate));
cl2.setTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD, endDate));
} catch (Exception e) {
log.info(e.getMessage());
return Result.error("日期格式非法");
}
List<String> restDays = new ArrayList<>();
List<String> workDays = new ArrayList<>();
setSpecialDays(cl1, cl2, restDays, workDays);
int count = 0;
List<Date> dates = new ArrayList<>();
while (cl1.compareTo(cl2) <= 0) {
if (cl1.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cl1.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
dates.add(cl1.getTime());
count++;
if (restDays.contains(DateFormatUtils.format(cl1.getTime(), DateUtils.YYYY_MM_DD))) {
dates.remove(cl1.getTime());
count--;
}
}
if (workDays.contains(DateFormatUtils.format(cl1.getTime(), DateUtils.YYYY_MM_DD))) {
dates.add(cl1.getTime());
count++;
}
cl1.add(Calendar.DAY_OF_MONTH, 1);
}
WorkingDayRangeVo workingDayRangeVo = new WorkingDayRangeVo();
List<String> days = new ArrayList<>();
dates.forEach(date -> days.add(DateFormatUtils.format(date, DateUtils.YYYY_MM_DD)));
workingDayRangeVo.setCount(count).setDays(days);
return Result.success(workingDayRangeVo);
}
private void setSpecialDays(Calendar cl1, Calendar cl2, List<String> restDays, List<String> workDays) {
LambdaQueryWrapper<SysHolidayInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.between(SysHolidayInfo::getDate, cl1.getTime(), cl2.getTime());
List<SysHolidayInfo> holidayInfoList = this.list(queryWrapper);
List<SysHolidayInfo> holiday = holidayInfoList.stream().filter(x -> "1".equals(x.getType().toString())).collect(Collectors.toList());
holiday.removeIf(next -> computeWhetherIsSaturdayAndSunday(next.getDate()));
List<Date> collect = holiday.stream().map(SysHolidayInfo::getDate).collect(Collectors.toList());
collect.forEach(date -> {
restDays.add(DateUtils.dateTime(date));
});
List<SysHolidayInfo> takeTime = holidayInfoList.stream().filter(x -> "2".equals(x.getType().toString())).collect(Collectors.toList());
takeTime.removeIf(next -> !computeWhetherIsSaturdayAndSunday(next.getDate()));
List<Date> dateList = takeTime.stream().map(SysHolidayInfo::getDate).collect(Collectors.toList());
dateList.forEach(date -> {
workDays.add(DateUtils.dateTime(date));
});
}