如題所說,計算兩個日期之前的天數,排除節假日和周末。這里天數的類型為double,因為該功能實現的是請假天數的計算,有請一上午假的為0.5天。
嚴謹的做法是每個日期都要查詢數據庫,但是總體下來很浪費時間。
ps:
1.節假日存放在數據庫中
實現步驟:
1.循環每個日期
2.判斷每個日期是否為節假日或者為周末
3.若不是節假日和周末,天數+1
public double calLeaveDays(Date startTime,Date endTime){ double leaveDays = 0; //從startTime開始循環,若該日期不是節假日或者不是周六日則請假天數+1 Date flag = startTime;//設置循環開始日期 Calendar cal = Calendar.getInstance(); //從數據庫得到節假日的起始日期和終止日期 List<Map> maps = null; try{ maps = getDao().getHolidaysPeriod;//maps用於保存符合條件的所有節假日的起始日期和終止日期,如startDate:2017-07-13,endDate:2017-07-14 }catch (Exception e){ e.printStackTrace(); } //用於格式化日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); int week; outer:while(flag.compareTo(endTime)!=1){ cal.setTime(flag); //判斷是否為周六日 week = cal.get(Calendar.DAY_OF_WEEK) - 1; if(week == 0 || week == 6){//0為周日,6為周六 //跳出循環進入下一個日期 cal.add(Calendar.DAY_OF_MONTH, +1); flag = cal.getTime(); continue; }else{ //判斷是否為節假日 if(maps != null || !maps.isEmpty()){ inner:for (Map map : maps){ if(flag.compareTo((Date)map.get("startDay"))>-1&&flag.compareTo((Date)map.get("endDay"))<1){ //跳出循環進入下一個日期 cal.add(Calendar.DAY_OF_MONTH, +1); flag = cal.getTime(); continue outer; } } } } leaveDays = leaveDays + 1; //日期往后加一天 cal.add(Calendar.DAY_OF_MONTH, +1); flag = cal.getTime(); } return leaveDays; }