判斷兩個日期之間除去週末和規定節假日剩餘的天數(精確度為半天)
阿新 • • 發佈:2019-02-09
這兩天在寫一個專案,考勤系統,寫到請假的一塊,需要判斷請假的天數,在網上搜也沒有合意的,於是就自己寫了個。
請假天數以0.5天為單位,不足0.5天的按0.5天算,在請假頁面選擇的時候,只能選擇日期和上下午。
規定的節假日是存在資料庫中的,我這裡用的是ssh框架,連結的oracle
以下是程式碼:
//得到兩個日期之間的所有天的日期集合 private List<String> getDays(String startDate, String endDate) throws ParseException { Calendar startCalendar = Calendar.getInstance(); Calendar endCalendar = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date startDat = df.parse(startDate); startCalendar.setTime(startDat); Date endDat = df.parse(endDate); endCalendar.setTime(endDat); List<Calendar> list = new ArrayList<Calendar>(); List<String> listStr = new ArrayList<String>(); while (true) { if (startCalendar.getTimeInMillis() <= endCalendar.getTimeInMillis()) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(startCalendar.getTimeInMillis()); list.add(calendar); } else { break; } startCalendar.add(Calendar.DAY_OF_MONTH, 1); } for(int i=0;i<list.size();i++){ String str =df.format(list.get(i).getTime()); listStr.add(str); } return listStr; }
//判斷兩個日期之間有哪些日期是屬於規定節假日的,有如果是,就在集合中將這個日期刪除,用null代替 private List<String> holidayList(String startDate, String endDate) throws ParseException { String hql = "select count(id) from Attendance_Holiday where startDay<= TO_DATE(?,'yyyy-MM-dd') and endDay>= TO_DATE(?,'yyyy-MM-dd')"; List<String> listDate = getDays(startDate, endDate); for(int i=0;i<listDate.size();i++){ String day = listDate.get(i); List<Long> list = new ArrayList<Long>(); list = this.getHibernateTemplate().find(hql, day,day); if(list.get(0) != 0l){ listDate.set(i, null); } } return listDate; }
//判斷某一天是否是星期天,週六和週日 private boolean isWeekend(String date) throws ParseException { Calendar calendar = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = df.parse(date); calendar.setTime(date1); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); if (dayOfWeek == 1 || dayOfWeek == 7) { return true; } return false; }
//統計請假總天數,以0.5天為單位,startDate為開始日期,endDate為結束日期,startId為開始上下午,"1"代表是上午,“2”代表下午,endId代表結束的上下午
private float getCount(String startDate, String endDate,String startId,String endId) throws ParseException{
float count = 0;
List<String> listDate = this.holidayList(startDate, endDate);
//遍歷得到的所有天的日期集合,如果一個元素不為null,也就是說這一天不是法定節假日,那就判斷這一天是否是星期天,如果是的話,總天數+1
for(int i=0;i<listDate.size();i++){
String day = listDate.get(i);
if(day != null){
boolean boo = this.isWeekend(day);
if(boo ==false){
count ++;
}
}
}
//判斷請假的第一天是否是節假日和週末,如果不是,且請假從下午開始,那麼總天數減去0.5天
if(listDate.get(0) != null){
boolean boo = this.isWeekend(listDate.get(0));
if(boo == false){
if(startId.equals("2")){
count = (float) (count - 0.5);
}
}
}
//判斷請假的最後一天是否是節假日和週末,如果不是,且請假最後截至在上午,那麼總天數減去0.5天
if(listDate.get(listDate.size()-1) != null){
boolean boo = this.isWeekend(listDate.get(listDate.size()-1));
if(boo == false){
if(endId.equals("1")){
count = (float) (count -0.5);
}
}
}
return count;
}
下面是測試,
public static void main(String[] args) throws ParseException {
//用spring初始化
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext_Leave.xml");
Test test = (Test) ctx.getBean("test");
float count = 0;
count = test.getCount("2014-09-28", "2014-10-09", "1", "1");
System.out.println(count);
}
如果週末或者假期也算作是請假的話,就可以省去這些判斷了