//计算小时数 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Double hours= HolidayDateUtil.calculateTimeHour(format.format(leave.getStart_time()),format.format(leave.getEnd_time()),"08:00:00","11:30:00","13:00:00","17:30:00"); Double day=0.0; //计算半天 if(leave.getStart_time().getHours()<12){ if(hours<=3.5){ day=0.5; }else if(hours>3.5&&hours<=8){ day=1.0; }else{ day=Math.ceil(hours/8); } }else{ if(hours<=4.5){ day=0.5; }else if(hours>4.5&&hours<=8){ day=1.0; }else{ day=Math.ceil(hours/8); } } leave.setDays(day); leave.setCreate_user_id(userId); leave.setCreate_user_name(userName); int count = leaveMapper.add(leave); if(count < 0 ){ return RTN.rtn501("添加数据失败!"); }
------------------------------------------------------------------------------------------------------------------------------
HolidayDateUtil 放在util里
import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 请假计算(小时) * 1.除去 节假日 * 2.除去 其他规定的 非工作时间(有具体的 实行者指定) * 3.考虑一点 其他不上班时间 有些公司的特别 * @author fengjing * */ public class HolidayDateUtil { /** * 节假日查询接口 * 使用方法 url+yyyyMMdd */ //时间格式化 public final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public final static SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); // /** // * 从公认网站上获取 节假日信息 // * @param date 获取节假日的 公认网站 url="网站地址"+时间 时间格式yyyyMMdd // * @param // * @return 工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2, 网站失效-1, 数据格式改变-2 // */ // public static String getHoliday(String date) { // ChineseCalendarUtils cc = new ChineseCalendarUtils(); // try { // return cc.checkDate(date); // } catch (Exception e) { // e.printStackTrace(); // } // return null; // } /** * 判断某年某月有多少天 * @param year 年 "yyyy" * @param moun 月 "m" * @return */ public static int daysMonth(int year,int moun){ switch(moun){ case 0: return 31; case 1: return ((year%4==0&&year%100!=0)||year%400==0)?29:28; case 2: return 31; case 3: return 30; case 4: return 31; case 5: return 30; case 6: return 31; case 7: return 31; case 8: return 30; case 9: return 31; case 10: return 30; case 11: return 31; default: return 0; } } /** * 通过时间秒毫秒数判断两个时间的间隔 * @param tiny 开始时间 * @param large 结束时间 * @return 返回几天 */ public static int differentDaysByMillisecond(Date tiny,Date large){ if(format1.format(tiny).equals(format1.format(large))){ return 0; } Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInstance(); c1.setTime(tiny); c2.setTime(large); int result = c2.get(Calendar.DAY_OF_YEAR) - c1.get(Calendar.DAY_OF_YEAR); /*Double why = Double.valueOf((large.getTime() - tiny.getTime()))/(1000*3600*24); double d = Math.ceil(why);*/ return result; } /** * 通过时间秒毫秒数判断两个时间的间隔 * @param tiny 开始时间 * @param large 结束时间 * @return 返回几小时 */ public static double differentHoursByMillisecond(Date tiny,Date large){ double hours = ((double) ((large.getTime() - tiny.getTime())) / (1000*3600)); return hours; } /** * 时间格式yyyy-MM-dd HH:mm:ss * @param start 请假开始时间 yyyy-MM-dd HH:mm:ss * @param end 请假结束时间 yyyy-MM-dd HH:mm:ss * @param startM 上班早晨开始时间 HH:mm:ss * @param endE 上班早晨结束时间 HH:mm:ss * @param startAf 上班下午开始时间 HH:mm:ss * @param endAf 上班下午结束时间 HH:mm:ss * @return */ public static double calculateTimeHour(String start, String end, String startM, String endE, String startAf, String endAf){ if(start!=null&&end!=null&&startM!=null&&endE!=null&&startAf!=null&&endAf!=null){//确保时间格式正确和值存在 try { Date dataStart =cn.waifutong.supplyChain.util.HolidayDateUtil.format.parse(start); Date dataEnd = cn.waifutong.supplyChain.util.HolidayDateUtil.format.parse(end); double hours = 0; int monthDays = -1; int yearTime = dataStart.getYear()+1900; int mounthTime = dataStart.getMonth(); int dataTime = dataStart.getDate(); double lunchBreak; int interval = cn.waifutong.supplyChain.util.HolidayDateUtil.differentDaysByMillisecond(dataStart,dataEnd); //判断这年这月有多少天 monthDays = HolidayDateUtil.daysMonth(yearTime,mounthTime); //第一天请假开始时间 String startday = start.substring(start.lastIndexOf(" ")+1,start.length()-1); //最后一天请假结束时间 String endday = end.substring(end.lastIndexOf(" ")+1,end.length()-1); double totalDay = 0;//累积总共请假多少天 for(int i=0;i<=interval;i++){ if(interval==0){//间隔0天 也就是 请假在一天之内 // if(!"0".equals(HolidayDateUtil.getHoliday(yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>10?dataTime:"0"+dataTime)))){ // System.out.println(""+yearTime+(((mounthTime+1))>10?(mounthTime+1):"0"+(mounthTime+1))+(dataTime>10?dataTime:"0"+dataTime)+"非工作日期不需要计算"); // return 0; // } String s = start.substring(0,10)+" "+endE; String s1 = start.substring(0,10)+" "+startAf; String s2 = start.substring(0,10)+" "+startM; String s3 = start.substring(0,10)+" "+endAf; Date dataMorning = HolidayDateUtil.format.parse(s2); Date dataAfternoon = HolidayDateUtil.format.parse(s3); Date dataCenter1 = HolidayDateUtil.format.parse(s); Date dataCenter2 = HolidayDateUtil.format.parse(s1); //开始时间在9点前 结束时间:①9点前 ②9点到12点 ③12点到1点 ④1点到6点 ⑤6点后 if(dataStart.compareTo(dataMorning) <= 0){ if(dataEnd.compareTo(dataMorning) <= 0){ hours = 0; lunchBreak = 0; }else if(dataEnd.compareTo(dataMorning) > 0 && dataEnd.compareTo(dataCenter1) <= 0){ hours = differentHoursByMillisecond(dataMorning,dataEnd); lunchBreak = 0; }else if(dataEnd.compareTo(dataCenter1) > 0 && dataEnd.compareTo(dataCenter2) <= 0){ hours = differentHoursByMillisecond(dataMorning,dataCenter1); lunchBreak = 0; }else if(dataEnd.compareTo(dataCenter2) > 0 && dataEnd.compareTo(dataAfternoon) <= 0){ hours = differentHoursByMillisecond(dataMorning,dataEnd); lunchBreak = 1; }else{ hours = 8; lunchBreak = 0; } } //开始时间在9点到12点 结束时间:②9点到12点 ③12点到1点 ④1点到6点 ⑤6点后 else if(dataStart.compareTo(dataMorning) > 0 && dataStart.compareTo(dataCenter1) <= 0){ if(dataEnd.compareTo(dataMorning) > 0 && dataEnd.compareTo(dataCenter1) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = 0; }else if(dataEnd.compareTo(dataCenter1) > 0 && dataEnd.compareTo(dataCenter2) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = differentHoursByMillisecond(dataCenter1,dataEnd); }else if(dataEnd.compareTo(dataCenter2) > 0 && dataEnd.compareTo(dataAfternoon) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = 1; }else{ hours = differentHoursByMillisecond(dataStart,dataAfternoon); lunchBreak = 1; } } //开始时间在12点到1点 结束时间:③12点到1点 ④1点到6点 ⑤6点后 else if(dataStart.compareTo(dataCenter1) > 0 && (dataStart.compareTo(dataCenter2)) <= 0){ if(dataEnd.compareTo(dataCenter1) > 0 && dataEnd.compareTo(dataCenter2) <= 0){ hours = 0; lunchBreak = 0; }else if(dataEnd.compareTo(dataCenter2) > 0 && dataEnd.compareTo(dataAfternoon) <= 0){ hours = differentHoursByMillisecond(dataCenter2,dataEnd); lunchBreak = 0; }else{ hours = differentHoursByMillisecond(dataStart,dataAfternoon); lunchBreak = differentHoursByMillisecond(dataStart,dataCenter2); } } //开始时间在1点到6点 结束时间: ④1点到6点 ⑤6点后 else if(dataStart.compareTo(dataCenter2) >0 && dataStart.compareTo(dataAfternoon) <= 0){ if(dataEnd.compareTo(dataCenter2) > 0 && dataEnd.compareTo(dataAfternoon) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = 0; }else{ hours = differentHoursByMillisecond(dataStart,dataAfternoon); lunchBreak = 0; } } //开始时间在6点后 else{ hours = 0; lunchBreak = 0; } }else{//间隔超过一天 dataTime +=(i==0?0:1); if(dataTime>monthDays){ mounthTime ++; dataTime=1; if(mounthTime>11){ yearTime++; mounthTime=0; dataTime=1; } monthDays = HolidayDateUtil.daysMonth(yearTime,mounthTime); } //判断是否是节假日 // if(!"0".equals(HolidayDateUtil.getHoliday(yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>10?dataTime:"0"+dataTime)))){ // System.out.println(""+yearTime+(((mounthTime+1))>10?(mounthTime+1):"0"+(mounthTime+1))+(dataTime>10?dataTime:"0"+dataTime)+"非工作日期不需要计算"); // continue; // } String s1 = yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>=10?dataTime:"0"+dataTime)+" "+(i==0?startday:startM); String s2 = yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>=10?dataTime:"0"+dataTime)+" "+(i==interval?endday:endAf); Date dateMorning = HolidayDateUtil.format.parse(s1.substring(0,10)+" "+startM); Date dateAfternoon = HolidayDateUtil.format.parse(s1.substring(0,10)+" "+endAf); Date dateCenter1 = HolidayDateUtil.format.parse(s1.substring(0,10)+" "+endE); Date dateCenter2 = HolidayDateUtil.format.parse(s1.substring(0,10)+" "+startAf); dataStart = HolidayDateUtil.format.parse(s1); dataEnd = HolidayDateUtil.format.parse(s2); //第一天 dataEnd为6点 判断开始时间 ①9点前 ②9点到12点 ③12点到1点 ④ 1点到6点 ⑤ 6点之后 if(i == 0){ if(dataStart.compareTo(dateMorning) <= 0){ hours = 8; lunchBreak = 0; }else if(dataStart .compareTo(dateMorning) > 0 && dataStart.compareTo(dateCenter1) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = 1; }else if(dataStart.compareTo(dateCenter1) > 0 && dataStart.compareTo(dateCenter2) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = differentHoursByMillisecond(dateCenter1,dataStart); }else if(dataStart.compareTo(dateCenter2) > 0 && dataStart.compareTo(dateAfternoon) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = 0; }else{ hours = 0; lunchBreak = 0; } //中间天 hours 为8 lunchBreak为0 }else if( i != 0 && i != interval){ hours = 8; lunchBreak = 0; //最后一天 dataStart为9点 判断结束时间 ①9点前 ②9点到12点 ③12点到1点 ④ 1点到6点 ⑤ 6点之后 }else{ if(dataEnd.compareTo(dateMorning) <= 0){ hours = 0; lunchBreak = 0; }else if(dataEnd .compareTo(dateMorning) > 0 && dataEnd.compareTo(dateCenter1) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = 0; }else if(dataEnd.compareTo(dateCenter1) > 0 && dataEnd.compareTo(dateCenter2) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = differentHoursByMillisecond(dateCenter1,dataEnd); }else if(dataEnd.compareTo(dateCenter2) > 0 && dataEnd.compareTo(dateAfternoon) <= 0){ hours = differentHoursByMillisecond(dataStart,dataEnd); lunchBreak = 1; }else{ hours = 8; lunchBreak = 0; } } } System.out.println(yearTime+"-"+(((mounthTime+1))>10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>10?dataTime:"0"+dataTime)+" 请假:"+(hours-lunchBreak)+"小时"); totalDay+=hours-lunchBreak; } System.out.println(totalDay); return totalDay; } catch (ParseException e) { e.printStackTrace(); } } return -1; } /** * 累积请假共多少天 * @param totalDay * @return totalDay < 24小时按小时算 totalDay >= 24小时按天算 */ public String totalDay(double totalDay){ if(totalDay > 24){ return (totalDay/24) + "天"; }else{ return totalDay + "小时"; } } public static void main(String args[]) throws IOException{ HolidayDateUtil qj= new HolidayDateUtil(); //测试 // qj.calculateTimeHour("2019-10-01 09:00:00","2019-10-03 12:00:00","08:00:00","11:30:00","13:00:00","17:30:00"); // qj.calculateTimeHour("2019-10-01 07:30:00","2019-10-01 22:00:00","00:00:00","08:00:00","17:30:00","24:00:00"); } }