最近在项目中,遇到了一个需求,就是需要计算实际的工时,就是我们实际工作过程中早上9点到晚上17点,每周五天工作制的工时。
代码如下所示:
1 //针对FT流程,计算剔除周末的每天8小时工作制的时间 2 function carryTime(date){ 3 if(date.getMinutes()>0&&date.getMinutes()<15){ 4 date.setMinutes(0); 5 } 6 if(date.getMinutes()>=15&&date.getMinutes()<30){ 7 date.setMinutes(30); 8 } 9 if(date.getMinutes()>30&&date.getMinutes()<45){ 10 date.setMinutes(30); 11 } 12 if(date.getMinutes()>=45){ 13 date.setHours(date.getHours()+1); 14 date.setMinutes(0); 15 } 16 return date; 17 } 18 function DateDiffNoWeekDay(startTimeTemp,endTimeTemp){ 19 var reg = new RegExp(",","g"); 20 var startTime = new Date(startTimeTemp.replace(reg,"/")); 21 var endTime = new Date(endTimeTemp.replace(reg,"/")); 22 if(startTime>=endTime) return 0; 23 startTime=carryTime(startTime); 24 endTime=carryTime(endTime); 25 var totalTime=0; 26 if(startTime.getDay()==6||startTime.getDay()==0){ 27 totalTime=endTime.getDate()-startTime.getDate(); 28 }else{ 29 totalTime=Math.floor(((endTime-startTime)/(3600*1000))/24);//计算小时 30 } 31 var tempStartTime=new Date(); 32 tempStartTime.setTime(startTime.getTime());//暂存开始时间 33 while(tempStartTime.getDate()<endTime.getDate()){ 34 if(tempStartTime.getDay()==6||tempStartTime.getDay()==0){ 35 totalTime--; 36 } 37 tempStartTime.setDate(tempStartTime.getDate()+1); 38 } 39 var temp=0; 40 do{ 41 if(startTime.getDay()==6 || startTime.getDay()==0){ 42 startTime.setDate(startTime.getDate()+1); 43 startTime.setHours(9); 44 startTime.setMinutes(0); 45 continue; 46 } 47 if(startTime.getHours()*60+startTime.getMinutes()>=9*60 && startTime.getHours()*60+startTime.getMinutes()<17*60){ 48 temp+=0.05; 49 } 50 startTime.setTime(startTime.getTime()+0.5*3600*1000); 51 }while(startTime.getHours()*60+startTime.getMinutes()!=endTime.getHours()*60+endTime.getMinutes()) //开始时间分钟数等于结束时间分钟数,跳出循环体 52 totalTime+=Math.floor(temp/0.8); 53 totalTime+=temp%0.8; 54 totalTime=Math.round(totalTime*100)/100; 55 if((startTime.getDay()!=6 && startTime.getDay()!=0) && 56 (startTimeTemp.split(" ")[1] == endTimeTemp.split(" ")[1]) && totalTime >= 0){ 57 //处理"2021-07-12 11:00:00","2021-07-13 11:00:00"小时分钟秒一样的情况, 58 //这个情况下,会导致天数多1的情况 59 totalTime--; 60 } 61 var days=Math.floor(totalTime); 62 var hours=Math.round((totalTime-days)*100)/10; 63 if(endTime.getDay()==6||endTime.getDay()==0){ 64 days--; 65 } 66 //document.write(" <u> "+days+" </u>day<u> "+hours+" </u>hour");//返回HTML格式的时间 67 console.log("DateDiffNoWeekDay result:"+days+" day "+hours+" hour"); 68 return days*8+hours; 69 }
调用方法:
DateDiffNoWeekDay("2021-07-12 14:00:00","2021-07-13 15:00:00");
执行结果: