1.說明:java
獲取n個工做往後的日期(包含法定節假日、雙休日、節後補班),須要在數據庫手動入庫當年的法定節假日及節假日調休補班。(也可寫在配置文件中讀取)sql
2.工具類代碼數據庫
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; /** * 用於查詢n個工做日(包含法定節假日、雙休日、調休)後的日期 * @author ywh * @version 建立時間:2019年4月24日 下午5:50:29 */ public class HolidayUtils { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); /** * 用於判斷n個工做日(排除節假日、週六日包含節後補班數據)後的日期 * * @author ywh * @version 建立時間:2019年4月24日 上午11:24:58 * @param list 節假日數據源 * @param weekDayList 節後補班數據源 * @param today 計算開始時間 * @param num 多少個工做日 根據須要自行安排 * @return * @throws ParseException */ @SuppressWarnings("deprecation") public static Date getScheduleActiveDate(List<String> list,List<String> weekDayList, Date today,int num) throws ParseException { String today1 = DateUtils.parseDate(today, "yyyy-MM-dd"); Date tomorrow = null; int delay = 1; while(delay <= num){ tomorrow = getTomorrow(today); //當前日期+1即tomorrow,判斷是不是節假日,同時要判斷是不是週末,都不是則將scheduleActiveDate日期+1,直到循環num次便可------不是節假日不是週末而且不是補班 if((!isWeekend(sdf.format(tomorrow)) && !isHoliday(sdf.format(tomorrow),list)) || isWorkWeekDay(sdf.format(tomorrow),weekDayList)){ if(isWorkWeekDay(sdf.format(tomorrow),weekDayList)){ System.out.println(sdf.format(tomorrow) + "::是節假日調休補班"); }else{ System.out.println(sdf.format(tomorrow) + "::是正常工做日"); } delay++; today = tomorrow; }else if (isHoliday(sdf.format(tomorrow),list)){ // tomorrow = getTomorrow(tomorrow); today = tomorrow; System.out.println(sdf.format(tomorrow) + "::是節假日"); }else if(isWeekend(sdf.format(tomorrow))){//是週六日而且不是節後補班 if(!isWorkWeekDay(sdf.format(tomorrow),weekDayList)){ today = tomorrow; System.out.println(sdf.format(tomorrow) + "::是休息日"); } } } System.out.println(today1+"後"+num+"個工做往後,日期爲::" + sdf.format(today)); return today; } /** * 獲取明天的日期 * * @author ywh * @version 建立時間:2019年4月23日 下午5:18:44 */ public static Date getTomorrow(Date date){ Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, +1); date = calendar.getTime(); return date; } /** * 判斷是不是weekend * * @author ywh * @version 建立時間:2019年4月23日 下午5:19:27 */ public static boolean isWeekend(String sdate) throws ParseException { Date date = sdf.parse(sdate); Calendar cal = Calendar.getInstance(); cal.setTime(date); if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){ return true; } else{ return false; } } /** * 判斷是不是holiday * * @author ywh * @version 建立時間:2019年4月23日 下午5:19:42 */ public static boolean isHoliday(String sdate, List<String> list) throws ParseException { if(list.size() > 0){ for(int i = 0; i < list.size(); i++){ if(sdate.equals(list.get(i))){ return true; } } } return false; } /** * 判斷是不是補班 * * @author ywh * @version 建立時間:2019年4月23日 下午5:19:54 */ public static boolean isWorkWeekDay(String sdate, List<String> list) throws ParseException { if(list.size() > 0){ for(int i = 0; i < list.size(); i++){ if(sdate.equals(list.get(i))){ return true; } } } return false; } /** * 把日期格式化成字符串 * @param date * @param format 例: yyyy-MM-dd * @return */ public static String parseDate(Date date, String format) { SimpleDateFormat formater = new SimpleDateFormat(format); String dateString; dateString = formater.format(date); return dateString; } }
3.測試調用工具
public String holiday(String date){ Date today1 = new Date(); int num = 10;// List<Holiday> holidayList = holidayService.queryAllHoliday("0");//查詢出法定節假日list List<Holiday> weekDayList =holidayService.queryAllHoliday("1");//查詢節假日調休補班list List hoList = new ArrayList();//節假日數據源 List weList = new ArrayList();//節後節前數據源 for (Holiday holiday : holidayList) { hoList.add(holiday.getDate()); } for (Holiday holiday : weekDayList) { weList.add(holiday.getDate()); } try { Date date111 = HolidayUtils.getScheduleActiveDate(hoList,weList,today1,num); System.out.println(HolidayUtils.parseDate(date111, "yyyy-MM-dd")); } catch (ParseException e) { e.printStackTrace(); } return ""; }
4.sql腳本測試
DROP TABLE IF EXISTS `holiday`; CREATE TABLE `holiday` ( `GUID` varchar(36) COLLATE utf8_bin NOT NULL, `DATE` varchar(10) COLLATE utf8_bin DEFAULT NULL, `TYPE` varchar(1) COLLATE utf8_bin DEFAULT NULL COMMENT '0:法定節假日;1 節假日調休補班(如某個節假日先後週六日上班的狀況)', PRIMARY KEY (`GUID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='此表需每一年根據法定節假日具體時間更新一次'; -- ---------------------------- -- Records of holiday -- ---------------------------- INSERT INTO `holiday` VALUES ('1', '2019-05-01', '0'); INSERT INTO `holiday` VALUES ('10', '2019-09-15', '0'); INSERT INTO `holiday` VALUES ('11', '2019-10-01', '0'); INSERT INTO `holiday` VALUES ('12', '2019-10-02', '0'); INSERT INTO `holiday` VALUES ('13', '2019-10-03', '0'); INSERT INTO `holiday` VALUES ('14', '2019-10-04', '0'); INSERT INTO `holiday` VALUES ('15', '2019-10-05', '0'); INSERT INTO `holiday` VALUES ('16', '2019-10-06', '0'); INSERT INTO `holiday` VALUES ('17', '2019-10-07', '0'); INSERT INTO `holiday` VALUES ('18', '2019-04-28', '1'); INSERT INTO `holiday` VALUES ('19', '2019-05-05', '1'); INSERT INTO `holiday` VALUES ('2', '2019-05-02', '0'); INSERT INTO `holiday` VALUES ('20', '2019-09-29', '1'); INSERT INTO `holiday` VALUES ('21', '2019-10-12', '1'); INSERT INTO `holiday` VALUES ('3', '2019-05-03', '0'); INSERT INTO `holiday` VALUES ('4', '2019-05-04', '0'); INSERT INTO `holiday` VALUES ('5', '2019-06-07', '0'); INSERT INTO `holiday` VALUES ('6', '2019-06-08', '0'); INSERT INTO `holiday` VALUES ('7', '2019-06-09', '0'); INSERT INTO `holiday` VALUES ('8', '2019-09-13', '0'); INSERT INTO `holiday` VALUES ('9', '2019-09-14', '0');