前端计算工时——早9晚5,,剔除周六周天

  最近在项目中,遇到了一个需求,就是需要计算实际的工时,就是我们实际工作过程中早上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");

  执行结果:

     

原文地址:https://www.cnblogs.com/lujun1949/p/15009519.html