1. 程式人生 > >談談JAVA實現節假日驗證

談談JAVA實現節假日驗證

我們需要兩個類,第一個類:

我們叫它驗證類。

第二個類:

它是對法定節假日的抽象。

第一步開始:

    當驗證類被初始化的時候,會載入本年的所有法定節假日到一個list裡:

thisYearHolidays.add(new Holiday("元旦")
                .setHolidayRange(LocalDate.now().withMonth(1).withDayOfMonth(1),1)
        );

        thisYearHolidays.add(new Holiday("春節")
                .setHolidayRange(LocalDate.now().withMonth(2).withDayOfMonth(15),7)
                .setWorkDayRange(LocalDate.now().withDayOfMonth(2).withDayOfMonth(11),1)
                .setWorkDayRange(LocalDate.now().withDayOfMonth(2).withDayOfMonth(24),1)
        );

        thisYearHolidays.add(new Holiday("清明")
                .setHolidayRange(LocalDate.now().withMonth(4).withDayOfMonth(5),3)
                .setWorkDayRange(LocalDate.now().withMonth(4).withDayOfMonth(8),1)
        );
//此處省略...

那麼,Holiday這個類,setHolidayRange與setWorkDayRange這兩個函式負責的就是處理法定節假日的休息日與調休日。

public Holiday setHolidayRange(LocalDate baseDate,int holidays){
        holidayList.add(baseDate);
        for(int i = 1;i<holidays;i++){
            holidayList.add(baseDate.plusDays(i));
        }

        return this;
    }

以上為setHolidayRange程式碼,setWorkDayRange相似。

接下來,當我們呼叫驗證類的todayIsHoliday方法時,它會判斷當前日期是否為法定節假日的休息日,再判斷當前日期是否不在調休日內,最後判斷是否是週末,程式碼如下:

public boolean todayIsHoliday(){
        LocalDate today=LocalDate.now();

        //首先判斷是否是節假日
        if(isHoliday(today)){
            return true;
        }

        //判斷不在調休日並且今天是週末
        return !inAdjustDay(today) && isWeekend(today);

    }

其中,這裡有兩個關鍵函式:

isHoliday和inAdjustDay:

isHoliday 原理就是通過迴圈判斷傳入的日期是否在法定節假日的休息日列表裡:

private boolean isHoliday(LocalDate date){
        //迴圈判斷date是否在holidayList 裡
        for(Holiday holiday:thisYearHolidays){
            if(holiday.isHoliday(date)){
                return true;
            }
        }
        return false;
    }

而inAdjustDay原理同上:

private boolean inAdjustDay(LocalDate date){

        for(Holiday holiday:thisYearHolidays){
            if(holiday.inAdjustDay(date)){
                return true;
            }
        }
        return false;
    }

這裡的兩個方法又各自呼叫了Holiday類的介面:

/*
    * 判斷傳入的日期是否應該放假
    * */
    public boolean isHoliday(LocalDate date){

        for(LocalDate localDate:holidayList){
            if(localDate.equals(date)){
                return true;
            }
        }
        return false;
    }

    /*
    * 判斷傳入的日期是否在調休日
    * */
    public boolean inAdjustDay(LocalDate date){
        for(LocalDate localDate:workDayList){
            if(localDate.equals(date)){
                return true;
            }
        }
        return false;
    }

這兩個方法也是通過再次迴圈判斷傳入的日期是否在內部所維護的休息日列表或工作日列表,來決定是否是休息日或者是工作日。

程式碼很零散,附上github地址:https://github.com/cjp715711877/holidayValid

擴充套件

在初始化驗證類的時候,做了手動新增節假日的操作,這是一種不優美的實現,

能否通過第三方api或者讀取外部配置來進行新增節假日?

這是一個想法。