1. 程式人生 > >js 判斷同一天的多個時間段是否存在交叉的部分

js 判斷同一天的多個時間段是否存在交叉的部分

js 判斷同一天的多個時間段是否存在重疊的部分

**基本的思路:日期也可以當成字串進行比較,把開始日期,結束日期分別存進兩個陣列,並用sort排序,迴圈遍歷陣列,從開始時間的第二個元素去比較結束時間的第一個元素,如果小於,就代表時間段有交叉,直接跳出,不然就繼續遍歷,遍歷結束,說明時間沒有重複,可以提交。**

1. 獲取開始時間和結束時間,將時間轉化成秒數 ;

2. 比較開始時間秒數和結束時間秒數,驗證結束時間大於開始時間;

3. 獲取當前新增的資料是星期幾的,取表格中所有當前星期的開始時間和結束時間存到陣列中(以下說的陣列:均為時間秒數大小的陣列);

4. 將新增加的時間也push到開始時間和結束時間陣列中;

5. 將開始和結束時間陣列分別升序排序;

6. 迴圈遍歷陣列,從開始時間的第二個元素去比較結束時間的第一個元素,如果小於,就代表時間段有交叉,直接跳出,不然就繼續遍歷,遍歷結束,說明時間沒有重複,可以提交

function sortNumber(a,b) {    
    return a - b;//數值型陣列大小升序排序
}
function getWorkTimeData(){    
    var i=[];    
    var n=[];	
    var rowData = {};	
    if(!$("#worktimeForm").validationEngine('validate')) {		
        return null;//非空驗證
    }	
    var whatDayIsIt=$('#whatDayIsIt').val();//獲取今天是周幾    
    varstartWorkTime=document.getElementById('startTime');    
    var endWorkTime=document.getElementById('endTime');   
    var starText=startTime.options[startTime.selectedIndex].text;//開始時間   
    var endText=endTime.options[endTime.selectedIndex].text;//結束時間    
    i= startTimeText.split(":");    n= endTimeText.split(":");   
    var startTimeSecond=parseInt(i[0])*60+parseInt(i[1]);//開始時間秒數 
    var endTimeSecond=parseInt(n[0])*60+parseInt(n[1]);//結束時間秒數    
    if(startTimeSecond>=endTimeSecond){
        alert('結束時間必須大於開始時間');           
        return	
    }    
    var rowDataGrid=$("#targetGrid").jqGrid("getRowData");    
    var endTimeSecondArr=[];   
    var startTimeSecondArr=[];   
    if(rowDataGrid.length>0){        
        for(var i=0;i<rowDataGrid.length;i++){
            if(rowDataGrid[i].week==whatDayIsIt){                
                var ss= rowDataGrid[i].startTime.split(":");  ​
                var nn= rowDataGrid[i].endTime.split(":");   ​
                var startTimeSecondA=parseInt(ss[0])*60+parseInt(ss[1]);                
                var endTimeSecondA=parseInt(nn[0])*60+parseInt(nn[1]); ​
                startTimeSecondArr.push(startTimeSecondA);//已加入到表格中的開始時間秒數                
                endTimeSecondArr.push(endTimeSecondA)            
            }        
        }  ​
        startTimeSecondArr.push(startTimeSecond);//將當前選擇的開始時間秒數加入到的開始時間秒數陣列中        
        endTimeSecondArr.push(endTimeSecond);  ​
        var begin = startTimeSecondArr.sort(sortNumber);   ​
        var over = endTimeSecondArr.sort(sortNumber);   ​
        for(var k=1;k<begin.length;k++){     ​
            if (begin[k] < over[k-1]){    ​
                alert('同一天內所有的上下班時間段不能有重合');               
                return false; ​
            }        
        }    
    }    
    if(tplid){//修改​
        rowData.tmpId=tplid;    
    }else {//新增        
        rowData.tmpId='';    
    }    
    if($("#rowId").val()){ ​
        rowData.id=$("#rowId").val();    
    }else {        
        rowData.id='';    
    }    
    rowData.week=whatDayIsIt;​
    rowData.startTime=startTimeText; ​
    rowData.endTime=endTimeText;    
    return rowData;
}