1. 程式人生 > >判斷兩個日期之間除去週末和規定節假日剩餘的天數(精確度為半天)

判斷兩個日期之間除去週末和規定節假日剩餘的天數(精確度為半天)

這兩天在寫一個專案,考勤系統,寫到請假的一塊,需要判斷請假的天數,在網上搜也沒有合意的,於是就自己寫了個。

請假天數以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);
	}


如果週末或者假期也算作是請假的話,就可以省去這些判斷了