1. 程式人生 > >實用工具類--智慧跳過節假日(java)

實用工具類--智慧跳過節假日(java)

智慧跳過節假日(根據開始時間和工作日數 返回日期)

準備:
需要自己去計算當年的異常的日期(異常指:週一至週五 上班的;週六週日 放假的;)我下面統計的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;

    }

}