如何只计算工作时间的工作时长 (part 2)

只计算工作时间的工作时长,工作时间固定为8:00-12:00,14:30-17:30,对于不在工作时间范围内的其它时间,一律转换为工作时间。其它时间转化为工作时间的规则为:
对于小于8点的时间,统一为8:00;
对于时间在12:01-14:30范围内的,统一为12:00;
对于17:30以后的时间,统一为17:30。

现有2个时间A,B(这两个时间包含日期在内),A为开始时间,B为结束时间,理论上B永远大于A,dd为借位,Ha为A的小时,Ma是A的分钟,Hb和Mb同样意思。

1、对于A,B都是上午(Ha和Hb都<12)
①A为8:39,B为10:40(即Ha60+Ma<Hb60 + Mb时),则时间差为1060+40 - (860+39)=121 => 2:01,dd=0,因此,这个情况下的时间差为 Hb60 + Mb - (Ha60+Ma) ,且 dd=0
②A为10:40,B为8:39(即Ha60+Ma>Hb60 + Mb时),则时间差为(17-10)60+30-40-150+(8-8)60+39 = 299 => 4:59,dd= -1,因此,这个情况下的时间差为 (17-Ha)60+30-Ma-150+(Hb-8)60+Mb ,且 dd= -1

2、A为上午,B为下午(Ha<12,Hb>12,即Ha60+Ma<Hb60 + Mb)
A为8:39,B为15:40,则时间差为 1560+40 -(860+39) - 150 =271 => 4:31 , dd=0。因此这个情况下的时间差为 Hb60 + Mb - (Ha60+Ma) - 150,且 dd=0

3、A为下午,B为上午(Ha>12,Hb<12,即Hb60 + Mb<Ha60+Ma)
A为15:40,B为8:39,则时间差为 (8-8)60+39 + 1760+30 - (15*60+40) = 149 => 2:29 ,dd = -1
因此这个情况下的时间差为 (Hb-8)60+Mb + 1760 + 30 - (Ha*60 + Ma),dd = -1

4、A为下午,B为下午(Ha>12,Hb>12)
①A为15:40,B为16:41(当Ha60+Ma<Hb60 + Mb),则时间差为 Hb60 + Mb - (Ha60+Ma) = 61 => 1:01,dd=0
②A为16:41,B为15:40(当Ha60+Ma>Hb60 + Mb),则时间差为 (Hb-8)60+Mb - 150 + 1760 + 30 - (Ha*60 + Ma) =359 => 5:59 ,dd= -1

这样,对于时间A为2019/1/16 16:32:09,B为2019/1/18 18:19:12(工作时间应为2019/1/18 17:30:00),两个时间的时间差为2天0小时58分。(适合规则4的①)
对于时间A为2019/1/16 8:39:09,B为2019/1/18 10:40:12(适合规则1的①)两个时间的时间差为2(18-16+0)天2小时01分
对于时间A为2019/1/16 10:40:09,B为2019/1/18 8:39:12(适合规则1的②)两个时间的时间差为1(18-16-1)天4小时59分
对于时间A为2019/1/16 8:39:09,B为2019/1/18 15:40:12(适合规则2)两个时间的时间差为2天4小时31分
对于时间A为2019/1/16 16:41:09,B为2019/1/18 15:40:12(适合规则4的②)两个时间的时间差为1(18-16-1)天5小时59分
对于时间A为2019/1/16 15:40:09,B为2019/1/18 8:39:12(适合规则3)两个时间的时间差为1(18-16-1)天2小时29分

对于如何转化成工作时间,如下:

function test(t_hour1,t_min1) {
    var correctHour=0,correctMin=0;
    if (t_min1<=30) {
        if(t_hour1<8){correctHour = 8;correctMin= 0;}
        else if(8 <= parseInt(t_hour1) && parseInt(t_hour1) <12){correctHour = t_hour1;correctMin= t_min1;}
        else if(12<= parseInt(t_hour1) && parseInt(t_hour1) <= 14){correctHour = 12;correctMin= 0;}
        else if( 14<parseInt(t_hour1) && parseInt(t_hour1) <=17){correctHour = t_hour1;correctMin= t_min1;}
        else {correctHour = 17;correctMin= 30;}
    } 
    else {  //if else t_min1>30
        if(t_hour1<8){correctHour = 8;correctMin= 0;}
        else if(8 <= parseInt(t_hour1) && parseInt(t_hour1) <12){correctHour = t_hour1;correctMin= t_min1;}
        else if(12<= parseInt(t_hour1) && parseInt(t_hour1) < 14){correctHour = 12;correctMin= 0;}
        else if( 14<=parseInt(t_hour1) && parseInt(t_hour1)<17){correctHour = t_hour1;correctMin= t_min1;}
        else {correctHour = 17;correctMin= 30;}

    }
    return correctHour + ':' + correctMin;
}

function getWork(time1_hour,time1_min,time2_hour,time2_min) {
 
    var timeA = test(time1_hour,time1_min);
    var timeB = test(time2_hour,time2_min);
    var Ha = timeA.split(":")[0];
    var Ma = timeA.split(":")[1];
    var Hb = timeB.split(":")[0];
    var Mb = timeB.split(":")[1];
    Ha=parseInt(Ha);Hb=parseInt(Hb);
    Ma=parseInt(Ma);Mb=parseInt(Mb);
    var dd,minutesDiff,output;
    var pd1_1,pd1_2,pd2,pd3,pd4_1,pd4_2;
    pd1_1 = Ha*60+Ma < Hb*60+Mb;
    pd1_2 = Ha*60+Ma > Hb*60+Mb;
    if(Ha<12 && Hb<12){if(pd1_1){output = Hb*60+Mb-(Ha*60+Ma);dd=0;}else{output = (17-Ha)*60+30-Ma-150+(Hb-8)*60+Mb;dd=-1;console.log('1');}}
    else if(Ha<12 && Hb>12){output = Hb*60+Mb-(Ha*60+Ma)-150;dd=0;console.log('2');}
    else if(Ha>12 && Hb<12){output =(Hb-8)*60+Mb+17*60+30-(Ha*60+Ma);dd=-1;console.log('3');} 
    else {if(pd1_1){output=Hb*60+Mb-(Ha*60+Ma);dd=0}else{output=(Hb-8)*60+Mb-150+17*60+30-(Ha*60+Ma);dd=-1;console.log('4');}}

    return {'result':output,'dayDiff':dd};
}

这样对于时间A为2019/1/16 10:40:09,B为2019/1/18 8:39:12
通过调用var xx1 = getWork(10,40,8,39); //xx为{'result':299,'dayDiff':-1}
就可以计算出工作时间的时长了,1天4小时59分 (1=18-16+xx1.dd,4=parseInt(xx1.result/60),59=xx1.result%60).

我想请教大家能不能对我这个代码优化一下。

阅读 1.9k
1 个回答

其实挺无语的,这个功能点你自己思考过吗?遇到过什么困难?

把需求全部贴出来,直接想让大家给你实现,你这个代码想别人写出来,估计得付费吧。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题