做项目时,写到一个请假的模块,需要计算请假工时,去除周六周末,时间为一天8H,8:00-17:00,中午12:00-13:00 为午休时间
function getLeaveTime(startDate,endDate){ var datetime1 = new Date(startDate), datetime2 = new Date(endDate); var date1 = datetime1.setHours(0,0,0); //开始日期,毫秒表示 var date2 = datetime2.setHours(0,0,0); //结束日期,毫秒表示 datetime1.setHours(startDate.substr(11,2),0,0); datetime2.setHours(endDate.substr(11,2),0,0); var travelHours = 0; //保存请假小时数 //开始结束时间均在一天 if(date1 == date2){ //1.开始时间8-12点 if(datetime1.getHours()>=8 && datetime1.getHours()<=12){ //1.1 结束时间在8-12点 if(datetime2.getHours()>=8 && datetime2.getHours()<=12){ travelHours += (datetime2.getHours()- datetime1.getHours() ); } //1.2 结束时间在13-17点 if(datetime2.getHours()>=13 && datetime2.getHours()<=17){ travelHours += 12- datetime1.getHours()+datetime2.getHours()-13; } //1.3 if(datetime2.getHours()>17){ toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time); return; } } //如果开始时间小于8点 if(datetime1.getHours()<8){ toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time); return; } //如果开始时间大于17点, if(datetime1.getHours()>17){ toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time); return; } //2.开始时间在13-17点 if(datetime1.getHours()>=13 && datetime1.getHours()<=17){ //1.2 结束时间在13-17点 if(datetime2.getHours()>=13 && datetime2.getHours()<=17){ travelHours += datetime2.getHours()-datetime1.getHours(); } //2.2 如果结束时间在17点之后,则工时累计到17点截止 if(datetime2.getHours()>17){ travelHours += 17-datetime1.getHours(); } } }else{ //如果开始时间小于8点,则计算工时的时候从8点开始计算 if(datetime1.getHours()<8){ toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time); return; } //如果开始时间大于17点, if(datetime1.getHours()>17){ toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time); return; } if(datetime2.getHours()<8){ toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time); return; } //1.3 if(datetime2.getHours()>17){ toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time); return; } //计算开始时间当天工时 if(datetime1.getHours()>=8 && datetime1.getHours()<=12){ travelHours+=17-datetime1.getHours()-1; } if(datetime1.getHours()>=13 && datetime1.getHours()<=17){ travelHours+=17-datetime1.getHours(); } //计算结束时间当天工时 if(datetime2.getHours()>=8 && datetime2.getHours()<=12){ travelHours+=datetime2.getHours()-8; } if(datetime2.getHours()>=13 && datetime2.getHours()<=17){ travelHours+=datetime2.getHours()-8-1; } //计算开始时间和结束时间相差天数 开始时间和结束时间不算进去,只计算相差的时间 if((date2 - date1) / 1000 / 60 / 60 / 24-1>0){ travelHours+=((date2 - date1) / 1000 / 60 / 60 / 24-1)*8; } //计算开始时间和结束时间之中有几个周六周末,然后去除这个时间 if((weekendBetween(new Date(date1),new Date(date2)))>0){ travelHours-=weekendBetween(new Date(date1),new Date(date2))*8; } } return travelHours; }
这个计算两个日期之间有几个周末,转载http://www.cnblogs.com/darkangle/archive/2008/02/14/1069182.html
//计算两个日期之间有几个周末 function weekendBetween(dtStart, dtEnd) { if (typeof dtEnd == 'string' ) dtEnd = StringToDate(dtEnd); if (typeof dtStart == 'string' ) dtStart = StringToDate(dtStart); var days = parseInt((dtEnd - dtStart) / 86400000); var adds = 0; var m = (days+ dtStart.getDay() +1) % 7; if(m > 0) adds = m; if(m >2) adds = 2; var redu = 0 if(dtStart.getDay() > 0) redu = 2; if(dtStart.getDay() ==1) redu =1; var subtotal = parseInt((days + dtStart.getDay() +1)/7)*2; return subtotal - redu + adds; }