只计算工作时间的工作时长,工作时间固定为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).
我想请教大家能不能对我这个代码优化一下。
其实挺无语的,这个功能点你自己思考过吗?遇到过什么困难?
把需求全部贴出来,直接想让大家给你实现,你这个代码想别人写出来,估计得付费吧。。。