package com.ruoyi.common.utils; import java.text.ParseException; import java.util.*; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; /** * @author px */ public class CalcWorkDays { /** * 法定节假日列表 * * @return */ public static List<String> getHolidayList() { List<String> holidays = new ArrayList<>(); // 元旦 holidays.add("2023-01-01"); holidays.add("2023-01-02"); // 春节 holidays.add("2023-01-21"); holidays.add("2023-01-22"); holidays.add("2023-01-23"); holidays.add("2023-01-24"); holidays.add("2023-01-25"); holidays.add("2023-01-26"); holidays.add("2023-01-27"); // 清明节 holidays.add("2023-04-05"); // 劳动节 holidays.add("2023-04-29"); holidays.add("2023-04-30"); holidays.add("2023-05-01"); holidays.add("2023-05-02"); holidays.add("2023-05-03"); // 端午节 holidays.add("2023-06-22"); holidays.add("2023-06-23"); holidays.add("2023-06-24"); // 中秋节与国庆节 holidays.add("2023-09-29"); holidays.add("2023-09-30"); holidays.add("2023-10-01"); holidays.add("2023-10-02"); holidays.add("2023-10-03"); holidays.add("2023-10-04"); holidays.add("2023-10-05"); holidays.add("2023-10-06"); return holidays; } /** * 需要上班的周末列表 * * @return */ public static List<String> getNeedWorkWeekends() { List<String> workWeekends = new ArrayList<>(); workWeekends.add("2023-01-28"); workWeekends.add("2023-01-29"); workWeekends.add("2023-04-23"); workWeekends.add("2023-05-06"); workWeekends.add("2023-06-25"); workWeekends.add("2023-10-07"); workWeekends.add("2023-10-08"); return workWeekends; } /** * 计算两个日期之间的工作日天数,包含起始日期,包含终止日期 * * @param start 计算开始时间 必须传yyyy-MM-dd的格式 * @param stop 计算结束时间 必须传yyyy-MM-dd的格式 * @return * @throws ParseException */ public static int calc(String start, String stop) throws ParseException { //获取今年的法定节假日期 List<String> workWeekends = getNeedWorkWeekends(); //获取今年需要补班的日期 List<String> holidays = getHolidayList(); String pattern = "yyyy-MM-dd"; Date begin = DateUtils.parseDate(start, pattern); Date endTime = DateUtils.parseDate(stop, pattern); Calendar cEnd = new GregorianCalendar(); cEnd.setTime(endTime); // 计算时算入stop当天 cEnd.add(Calendar.DATE,1); Date end=cEnd.getTime(); // Calendar c = Calendar.getInstance(); c.setTime(begin); int count = 0; String ymd = null; while (c.getTime().before(end)) { ymd = DateFormatUtils.format(c.getTime(), pattern); // 不是法定节假日 if (!holidays.contains(ymd)) { // 不是休息日 if (workWeekends.contains(ymd)) { count++; } else { // 非周末 if (c.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && c.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) { count++; } } } c.add(Calendar.DATE, 1); } return count; } /** * 计算开始日期之后的多少个工作日日期 * @param start 起始日期 yyyy-MM-dd格式 * @param days 相差天数 数字 * @return * @throws ParseException */ public static String daysAfter(String start, int days) throws ParseException { //获取今年的法定节假日期 List<String> workWeekends = getNeedWorkWeekends(); //获取今年需要补班的日期 List<String> holidays = getHolidayList(); String pattern = "yyyy-MM-dd"; Date begin = DateUtils.parseDate(start, pattern); Calendar cStart = new GregorianCalendar(); cStart.setTime(begin); // 计算时算入stop当天 cStart.add(Calendar.DATE,1); int count = days; String ymd = "2023-01-01"; while (count != 0){ Date startTime = cStart.getTime(); ymd = DateFormatUtils.format(startTime.getTime(), pattern); // 不是法定节假日 if (!holidays.contains(ymd)) { // 不是休息日 if (workWeekends.contains(ymd)) { count--; } else { // 非周末 if (cStart.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && cStart.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) { count--; } } } cStart.add(Calendar.DATE,1); } return ymd; } }
这个是参照了之前看到过的一位大佬写的2022年工作日计算,然后经过我的修改并添加了一个方法,可能我改得有点low,但是能用就行,哈哈哈