在写一个计算请假天数的方法,数据库中有法定假期的时间,计算请假时间段与法定假期时间段之间有交集的天数,以此推算出真正请假的天数。
下面是我写的方法,一共有六中可能性。
/**
* @param startDate
* @param endDate
* @param year
* @return
*/
public float countLeaveDays(Date startDate,Date endDate,int year)
{
List<Holidays> holidaysList = this.holidaysDao.queryByYear(year);
long dif = endDate.getTime() - startDate.getTime();
float leaveDays = (dif / (1000 * 60 * 60 * 24))+1;//正常请假天数
float days = 0;//交集天数
for(int i=0;i<holidaysList.size();i++){
Date bDate = holidaysList.get(i).getBegin();
Date eDate = holidaysList.get(i).getEnd();
//请假时间在法定节假日之前,无交集,正常计算请假天数
if(endDate.compareTo(bDate)>0){
continue;
}
//请假时间一部分在节假日之前,一部分在节假日期间,扣除包含在节假日的天数,剩余为请假天数
if(startDate.compareTo(bDate)<0 && endDate.compareTo(bDate) >=0 && endDate.compareTo(eDate)<=0){
if(endDate.compareTo(bDate)== 0){
days = 1;
}else if(endDate.compareTo(bDate) >0){
long diff = endDate.getTime() - bDate.getTime();
days = (diff / (1000 * 60 * 60 * 24))+1;
}
}
//节假期完全包含在请假时间之内,扣除节假日天数剩余为请假天数
if(startDate.compareTo(bDate)<0 && endDate.compareTo(eDate)>0){
long diff = eDate.getTime() - bDate.getTime();
days = (diff / (1000 * 60 * 60 * 24))+1;
}
//请假时间一部分在节假日之后,一部分在节假日期间,扣除包含在节假日的天数,剩余为请假天数
if(startDate.compareTo(bDate)>=0 && startDate.compareTo(eDate)<=0 && endDate.compareTo(eDate)>0){
if(startDate.compareTo(bDate)==0){
long diff = eDate.getTime() - bDate.getTime();
days = (diff / (1000 * 60 * 60 * 24))+1;
}
if(startDate.compareTo(eDate)==0){
days = 1;
}
if(startDate.compareTo(bDate)>0 && startDate.compareTo(eDate)<0){
long diff = eDate.getTime() - startDate.getTime();
days = (diff / (1000 * 60 * 60 * 24))+1;
}
}
//请假时间在节假日值后,无交集,正常计算请假天数
if(startDate.compareTo(eDate)>0){
continue;
}
//请假时间完全包含在节假日时间之内,无需计算请假天数。
if(startDate.compareTo(bDate)<=0 && endDate.compareTo(eDate)>=0){
return 0;
}
}
leaveDays = leaveDays - days;
return leaveDays;
}