项目组有一个需求,计算两个Date类型参数,相差的小时数。业务上有一些特殊的用途,可能用于绩效考核的目的吧…
如果不排除节假日周六日的话,处理起来非常easy,是个程序员都能写出来,但是…如果要排除法定节假日,排除正常周六日,同时特殊支持法定的工作日(有一些周六日,国家强制正常上班),那么处理起来就非常麻烦,我耗时大概1天半的时间,用基础的Date和Calendar实现,下面是具体的实现代码,要是有更好的实现,欢迎大家留言。
注意:项目组要求如果开始或者截止时间属于休息日,对应当天处理小时数为0。例如:2018-2-14 8:00:00 到2018-2-15 10:00:00,2-15是国家规定放假时间,不算时间,只算2-14号的16个小时。可以根据你们自己项目组的需求,灵活的修改哦
/**
* 判断输入的年月日日期是否属于休息日
* @param date 需要判断的日期(年月日)
* @param lawHolidayList 国家规定放假的时间
* @param lawWorkList 国家规定的工作日期
* @return
*/
public static boolean isDayOff(Date date,List<Date> lawHolidayList,List<Date> lawWorkList){
for(Date date1 :lawHolidayList){
int c = date.compareTo(date1);
if(c==0){
//休息日
return true;
}
}
for(Date date1 :lawWorkList){
int c = date.compareTo(date1);
if(c==0){
//工作日
return false;
}
}
return isZhouLiuZhouRiDate(date);
}
/**
* 判断时间是否属于正常周六日
* @param date
* @return
*/
public static boolean isZhouLiuZhouRiDate(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week = cal.get(Calendar.DAY_OF_WEEK) - 1;
//是否属于周六日
boolean flag = (week == 0 || week == 6);
return flag;
}
/**
* 排除国家法定的休息日、正常周六日,计算两个时间相差多少小时数(休息日当天时间为零处理)
* @param startTimeYYYYMMDDHHMMSS 年月日时分秒
* @param endTimeYYYYMMDDHHMMSS 年月日时分秒
* @param lawHolid