根据当前的日期判断前一个工作日是几号。
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----