public List<String> getHolidaysAndFestivals() {
//获取全部的节假日开始日期和结束日期
List<Holiday> listH = super.list();
List<String> list = new ArrayList<>();
for (Holiday h : listH) {
//获取节假日
list.addAll(getDateRange(h));
//获取节假日前后3天工作日
list.addAll(getDateWork(h));
}
return list;
}
/**
* 获取所有的节假日
*
* @return List<String>
*/
private List<String> getDateRange(Holiday h) {
List<String> list =new ArrayList<>();
// 开始日期
LocalDate start = h.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 结束日期
LocalDate end = h.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 获取两个日期之间的所有日期
List<LocalDate> dates = getDatesInRange(start, end);
convertCharacter(list, dates);
return list;
}
/**
* 获取工作日前后3天
*
* @return List<String>
*/
public List<String> getDateWork(Holiday h ) {
DayOfWeek[] weekends = {DayOfWeek.SATURDAY, DayOfWeek.SUNDAY};
List<String> list =new ArrayList<>();
// 开始日期
LocalDate start = h.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 结束日期
LocalDate end = h.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
List<LocalDate> dates=new ArrayList<>();
// 获取节假日前三
dates.addAll( getFirstThree( start, weekends));
// 获取节假日后三
dates.addAll( getThenThree(end,weekends));
convertCharacter(list, dates);
return list;
}
private void convertCharacter(List<String> list, List<LocalDate> dates) {
dates.forEach(q -> {
Date date = Date.from(q.atStartOfDay(ZoneId.systemDefault()).toInstant());
String format = DateUtil.format(date, "yyyy-MM-dd");
list.add(format);
});
}
// 判断日期是否为周末
public boolean isWeekend(LocalDate date, DayOfWeek[] weekends) {
DayOfWeek dayOfWeek = date.getDayOfWeek();
for (DayOfWeek weekend : weekends) {
if (dayOfWeek == weekend) {
return true;
}
}
return false;
}
// 获取节假日后三天的日期(不包括周末)
public List<LocalDate> getThenThree(LocalDate date, DayOfWeek[] weekends) {
List<LocalDate> workdays = new ArrayList<>();
LocalDate afterHoliday = date;
for (int i = 0; i < 3; i++) {
afterHoliday = afterHoliday.plusDays(1);
while ( isWeekend(afterHoliday, weekends)) {
afterHoliday = afterHoliday.plusDays(1);
}
workdays.add(afterHoliday);
}
return workdays;
}
// 获取节假日前三天的日期(不包括周末)
public List<LocalDate> getFirstThree(LocalDate date, DayOfWeek[] weekends) {
List<LocalDate> workdays = new ArrayList<>();
LocalDate beforeHoliday = date;
for (int i = 0; i < 3; i++) {
beforeHoliday = beforeHoliday.minusDays(1);
while (isWeekend(beforeHoliday, weekends)) {
beforeHoliday = beforeHoliday.minusDays(1);
}
workdays.add(beforeHoliday);
}
return workdays;
}
// 获取两个日期之间的所有日期(包括起始日期和结束日期)
public List<LocalDate> getDatesInRange(LocalDate start, LocalDate end) {
List<LocalDate> dates = new ArrayList<>();
LocalDate date = start;
while (!date.isAfter(end)) {
dates.add(date);
date = date.plusDays(1); // 递增一天
}
return dates;
}
获取节假日和节假日前三后三的工作日
最新推荐文章于 2024-09-15 09:47:04 发布