方案一:循环落入区间法
var a =[9,12:30,-,13:30,18];//时间区间,上午时间为 9-12:30下午时间为13:30-18:00,不需要用横线分割
var len=0;
var s,e;//分别为开始结束时间
for(var i=0,len=a.length;i<len;i++){
if(a[i]=='-' || a[i+1]=='-'){//要空出的时间直接不计算
continue;
}
if(e<a[i] || s>a[i+1] ){//位于区间外不计算时间
continue;
}else if(s<a[i] && e<a[i+1]){//位于开始时间之后
len+=e-a[i];
}else if (s<a[i] && e>a[i+1]){
len+=a[i+1]-a[i];
}else if (s>a[i] && e<a[i+1]){
len+=e-s;
}else if (s>a[i] && e>a[i+1]){
len+=a[i+1]-s;
}
}
方案二:去除边界计算(局限去除一个时间段)
var a =[9,12:30,13:30,18]
var s,e
//分别设置好边界
if(s<a[0]){
s=a[0];
}
if(e>a[3]){
e=a[3];
}
if(e<a[2] || s>a[3] ){//位于2端时,则各自相减
len=e-s;
}else if(s<a[2] && e<a[3]){//包含开始时
len+=a[2]-s;
}else if (s>a[2] && e>a[3]){//包含结束时
len+=e-a[3];
}else if (s<a[2] && e>a[3]){//包含结束时
len+=(a[2]-s)+(e-a[3]);
}
方案二实现:
function timeAreaDeal(startTime,endTime){
var len=0;
var workArr=['09:00','12:30','13:30','18:00'];
var workTimeArr=[];
for(var i=0,len=workArr.length;i<len;i++){//设置当天的时间字符串
workTimeArr.push(getNowFormatDate(workArr[i]));
}
if(sizeComparFun(startTime,workTimeArr[0])){
startTime=workTimeArr[0];
}
if(sizeComparFun(workTimeArr[3],endTime)){
endTime=workTimeArr[3];
}
if(sizeComparFun(endTime,workTimeArr[1]) || sizeComparFun(workTimeArr[2],startTime) ){
len=timeCol(startTime,endTime);
}else if(sizeComparFun(endTime,workTimeArr[2]) && sizeComparFun(startTime,workTimeArr[1]) ){
len=timeCol(startTime,workTimeArr[1]);
}else if(sizeComparFun(workTimeArr[1],startTime) && sizeComparFun(workTimeArr[2],endTime) ){
len=timeCol(workTimeArr[2],endTime);
}else if(sizeComparFun(startTime,workTimeArr[1]) && sizeComparFun(workTimeArr[2],endTime) ){
len=timeCol(startTime,workTimeArr[1])+timeCol(workTimeArr[2],endTime);
}
return len;
}
function timeCol(startDate,endDate){
var longtime=(new Date(Date.parse(endDate.replace(/-/g, "/")+":00"))-new Date(Date.parse(startDate.replace(/-/g, "/")+":00")))/3600000;
return longtime;
}
function sizeComparFun(t1,t2){
var bool=new Date(Date.parse(t2.replace(/-/g, "/")+":00"))>=new Date(Date.parse(t1.replace(/-/g, "/")+":00"));
return bool;
}