如何实现根据当前的日期,来确定前一个工作日

业务场景一:
根据当前的日期判断前一个工作日是几号。
1),通常情况是:在周2到周6的这五天时间里,获取前一个工作日的方法是简单的,就是:proviousBusinessDate= CurrentDate -1;同理可以推导出:2) 周1是: proviousBusinessDate= CurrentDate - 3; 3)周日是:proviousBusinessDate= CurrentDate -2;
java代码的实现如下:
    public static Date getPreviousBusinessDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

        if (dayOfWeek == Calendar.MONDAY) {
            calendar.add(Calendar.DATE, -3);
        } else if (dayOfWeek == Calendar.SUNDAY) {
            calendar.add(Calendar.DATE, -2);
        } else {
            calendar.add(Calendar.DATE, -1);
        }

        return calendar.getTime();
    }


业务场景二:
如果加入Holiday的情况,前一个工作日该如何确定。

现在情况有了变化,我们如果不仅仅要考虑周末休息天的情况,还要考虑holiday的节假日放假的场景的话,是否会有点不一样拟。
如果接着上面的思维:我们就会这样考虑:好了,我们不是根据当前的日期,拿到了前一个工作日了麽。那么我们就可以对这个日期再进行判断,如果previousBusinessDay是holiday的话,我们就再往前减一天,还是holiday就再减,一直到不是holiday为止(在这里holiday由一个holiday表来维护)。
代码就是:
if(holidayList.Contains(previousBusinessDay)){
previousBusinessDay = previousBusinessDay -1;
}

看到这个代码你是不是就看到bug了,这里有个问题是:当你减了很多天之后,你还是要再重新去判断你得到的这个日期是不是满足条件的,是不是在weekend里面,如果是在weekend里面的话,你得重新回去是周日周一及其他的情况。然后判断完了之后,你还得回来判断你是不是又回到了holiday.如此我们就陷入了一个死循环里面而无法自拔。

来吧,是时候跳出这个怪圈了。我们就不能换一种思路吗:
我们不管三七二十一先减一天,先拿到previousBusinessDay,然后再来判断我们拿到的这天是不是周末还是Holiday,如果是就减一,一直减直到减到不是为止。

show code:
    /**
     * get PreviousBusinessDate (exclude the holiday)
     * @param date
     * @param holidays
     * @return
     */
    public static Date getPreviousBusinessDate(Date date, List<Date> holidays) {
    	Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, -1);
        Date prevDate = cal.getTime();
    	//if the prevDate is Holiday, then get the day before prevDate.
    	while(isHoliday(prevDate, holidays) || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){
    		cal.add(Calendar.DATE, -1);
    		prevDate = cal.getTime();
    	}
    	
    	return prevDate;
    }
    
    
    /**
     * if the current Date is Holiday, return true, otherwise, return false
     * @return
     */
    public static boolean isHoliday(Date currentDate, List<Date> holidays) {
    	boolean isHoliday = false;
    	for (Date date : holidays) {
    		if(DateUtils.isSameDay(date, currentDate)) {
    			isHoliday = true;
    			break;
    		};
    	}
    	return isHoliday;
    }




如果有谁路过此地,能给出更好的算法,请一定show出来

----EOF----

猜你喜欢

转载自xfxlch.iteye.com/blog/2255399