實用工具類--智慧跳過節假日(java)
阿新 • • 發佈:2019-01-04
智慧跳過節假日(根據開始時間和工作日數 返回日期)
準備:
需要自己去計算當年的異常的日期(異常指:週一至週五 上班的;週六週日 放假的;)我下面統計的2019年的。實際專案中可以將異常資料放到快取裡、配置檔案、資料庫中都可,我這裡為了方便測試、寫到了程式碼中。一年的異常資料20天左右。
注:統計當前日期是否是工作日、有個第三方介面,但是感覺不太安全,也不太正式,所以自己統計。 好用給個贊哦,有問題可以留言。
package com.xesapp.platform.card.util; import java.text.SimpleDateFormat; import java.util.*; /** * pym */ public class DateUtils { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); /** * 根據開始時間和工作日數 返回日期 * @param startDate * @param num * @return */ public static String getEndDateByStratDatAndNnm(String startDate , Integer num){ //初始化日曆 Map<String, Boolean> stringBooleanMap = getDayMapByYear(Integer.valueOf(startDate.substring(0,4))); Calendar calendar = Calendar.getInstance(); calendar.set(Integer.valueOf(startDate.substring(0,4)),Integer.valueOf(startDate.substring(4,6))-1,Integer.valueOf(startDate.substring(6,8))); Date today = calendar.getTime(); Date tomorrow = null; int delay = 1; while(delay <= num){ tomorrow = getTomorrow(today); if(!stringBooleanMap.get(sdf.format(tomorrow))){ delay++; } today = tomorrow; } return sdf.format(today); } /** * 獲取tomorrow的日期 * * @param date * @return */ 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; } /** * 根據年刷出本年所有資料 * 資料格式 年 + 是否是節假日(如果是為true) * * @param year * @return */ public static Map<String,Boolean> getDayMapByYear( int year){ //休息 List offdayList = new ArrayList(); offdayList.add("20190101"); offdayList.add("20190204"); offdayList.add("20190205"); offdayList.add("20190206"); offdayList.add("20190207"); offdayList.add("20190208"); offdayList.add("20190405"); offdayList.add("20190501"); offdayList.add("20190607"); offdayList.add("20190913"); offdayList.add("20191001"); offdayList.add("20191002"); offdayList.add("20191003"); offdayList.add("20191004"); offdayList.add("20191007"); //上班 List holidayList = new ArrayList(); holidayList.add("20190202"); holidayList.add("20190203"); holidayList.add("20190929"); holidayList.add("20191012"); //定義一個日曆,變數作為年初 Calendar calendar = new GregorianCalendar(); //定義一個日曆,變數作為年末 Calendar calendarEnd = new GregorianCalendar(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, 0); //設定年初的日期為1月1日 calendar.set(Calendar.DAY_OF_MONTH, 1); calendarEnd.set(Calendar.YEAR, year); calendarEnd.set(Calendar.MONTH, 11); //設定年末的日期為12月31日 calendarEnd.set(Calendar.DAY_OF_MONTH, 31); boolean b ;//是否是節假日 Map<String,Boolean> map = new HashMap<>(400); //用一整年的日期迴圈 while(calendar.getTime().getTime()<=calendarEnd.getTime().getTime()){ //獲取星期幾 int i = calendar.get(Calendar.DAY_OF_WEEK)-1; String format = sdf.format(calendar.getTime()); if((i == 6 || i == 0) ){ if(holidayList.contains(format)){ b = false; }else{ b = true; } }else { if(offdayList.contains(format)){ b = true; }else { b = false; } } map.put(format,b); calendar.add(Calendar.DAY_OF_MONTH, 1); } return map; } }