在工作中遇到涉及工作日相关的需求,下面是个工具类
WorkDayUtils如下:
packagecom.sqds.utils;importorg.apache.commons.lang.StringUtils;importjava.text.SimpleDateFormat;importjava.util.*;/** * 工作日计算工具类 * Created by MJ·J on 2019-05-24 */publicclassWorkDayUtils{privatestaticSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");/*private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");*//** * 获取当前时间之前n个工作日的日期 * * @param holidays 节假日(日期格式:2019-01-01,2019-01-04,2019-01-05,......) * @param today 当前日期(日期格式:2019-01-01 08:08:08) * @param num 需要设置的n个工作日 * @return * @throws Exception */publicstaticStringgetWorkDayStart(Stringholidays,Stringtoday,intnum)throwsException{// 转化为数组String[]dayArr=holidays.split(",");List<String>holidayList=newArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Datedate=sdf.parse(today);// 获取工作日DateworkDay=getWorkDay(holidayList,num,date,-1);StringworkDayStr=sdf.format(workDay);longworkTime=getTime(today,workDayStr)-1000;// 减1秒returnsdf.format(newDate(workTime));}/** * 获取当前时间之后n个工作日的日期 * * @param dd 当前日期 * @param num 需要设置的n个工作日 * @return * @throws Exception */publicstaticDategetWorkDayEnd(Datedd,intnum)throwsException{// 节假日Stringholidays="2019-01-01,2019-01-04,2019-01-05,2019-01-06,2019-01-07,2019-01-08,2019-01-09,2019-01-10,2019-04-05,2019-04-06,2019-04-07,2019-05-01,2019-06-07,2019-06-08,2019-06-09,2019-09-13,2019-09-14,2019-09-15,2019-10-01,2019-10-02,2019-10-03,2019-10-04,2019-10-05,2019-10-06,2019-10-07";// 当前时间Stringtoday=sdf.format(dd);// 转化为数组String[]dayArr=holidays.split(",");List<String>holidayList=newArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Datedate=sdf.parse(today);// 获取工作日DateworkDay=getWorkDay(holidayList,num,date,1);StringworkDayStr=sdf.format(workDay);longworkTime=getTime(today,workDayStr)+1000;// 加1秒returnnewDate(workTime);}/** * 获取当前时间之后n个工作日的日期 * * @param holidays 节假日(日期格式:2019-01-01,2019-01-04,2019-01-05,......) * @param today 当前日期(日期格式:2019-01-01 08:08:08) * @param num 需要设置的n个工作日 * @return * @throws Exception */publicstaticStringgetWorkDayEnd(Stringholidays,Stringtoday,intnum)throwsException{// 转化为数组String[]dayArr=holidays.split(",");List<String>holidayList=newArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Datedate=sdf.parse(today);// 获取工作日DateworkDay=getWorkDay(holidayList,num,date,1);StringworkDayStr=sdf.format(workDay);longworkTime=getTime(today,workDayStr)+1000;// 加1秒returnsdf.format(newDate(workTime));}/** * 获取当前时间之后n个工作日的日期 * @param today 当前日期(日期格式:2019-01-01 08:08:08) * @param num 需要设置的n个工作日 * @return * @throws Exception */publicstaticStringgetWorkDayEnd(Stringtoday,intnum)throwsException{// 节假日Stringholidays="2019-01-01,2019-01-04,2019-01-05,2019-01-06,2019-01-07,2019-01-08,2019-01-09,2019-01-10,2019-04-05,2019-04-06,2019-04-07,2019-05-01,2019-06-07,2019-06-08,2019-06-09,2019-09-13,2019-09-14,2019-09-15,2019-10-01,2019-10-02,2019-10-03,2019-10-04,2019-10-05,2019-10-06,2019-10-07";// 转化为数组String[]dayArr=holidays.split(",");List<String>holidayList=newArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Datedate=sdf.parse(today);// 获取工作日DateworkDay=getWorkDay(holidayList,num,date,1);StringworkDayStr=sdf.format(workDay);longworkTime=getTime(today,workDayStr)+1000;// 加1秒returnsdf.format(newDate(workTime));}/** * 获取工作日 * * @param holidayList 节假日(日期格式:2019-01-01,2019-01-04,2019-01-05,......) * @param num 需要设置的n个工作日 * @param day 目标日期 * @return * @throws Exception */publicstaticDategetWorkDay(List<String>holidayList,intnum,Dateday,intn)throwsException{intdelay=1;while(delay<=num){// 获取前一天或后一天日期DateendDay=getDate(day,n);Stringtime=sdf.format(endDay);//当前日期+1即tomorrow,判断是否是节假日,同时要判断是否是周末,都不是则将scheduleActiveDate日期+1,直到循环num次即可if(!isWeekend(time)&&!isHoliday(time,holidayList)){delay++;}/* else if (isWeekend(time)) { System.out.println(time + "::是周末"); } else if (isHoliday(time, holidayList)) { System.out.println(time + "::是节假日"); }*/day=endDay;}returnday;}/** * yyyy-MM-dd HH:mm:ss格式日期---获取时间戳精确到秒 * * @param start 开始日期(日期格式:2019-01-01 08:08:08) * @param end 结束日期(日期格式:2019-01-01 08:08:08) * @return * @throws Exception */publicstaticlonggetTime(Stringstart,Stringend)throwsException{if(org.apache.commons.lang.StringUtils.isEmpty(start)||StringUtils.isEmpty(end)){thrownewRuntimeException("today is empty");}longtime1=sdf.parse(start).getTime();longtime2=sdf.parse(start).getTime();longtime3=sdf.parse(end).getTime();longtime=time3+(time1-time2);returntime;}/** * 获取前一天或后一天日期 * * @param date 日期 * @param n 判断参数 * @return */publicstaticDategetDate(Datedate,intn){if(n>0){// 获取前一天date=getTomorrow(date);}if(n<0){// 获取后一天date=getYesterday(date);}returndate;}/** * 获取后一天的日期 * * @param date * @return */publicstaticDategetTomorrow(Datedate){Calendarcalendar=Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DAY_OF_MONTH,+1);date=calendar.getTime();returndate;}/** * 获取前一天的日期 * * @param date * @return */publicstaticDategetYesterday(Datedate){Calendarcalendar=Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DAY_OF_MONTH,-1);date=calendar.getTime();returndate;}/** * 判断是否是周末 * * @param sdate * @return * @throws Exception */publicstaticbooleanisWeekend(Stringsdate)throwsException{Datedate=sdf.parse(sdate);Calendarcal=Calendar.getInstance();cal.setTime(date);if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY||cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){returntrue;}else{returnfalse;}}/** * 判断是否是节假日 * * @param sdate * @param list * @return * @throws Exception */publicstaticbooleanisHoliday(Stringsdate,List<String>list)throwsException{if(list.size()>0){for(inti=0;i<list.size();i++){if(sdate.equals(list.get(i))){returntrue;}}}returnfalse;}}