怎么样用JavaScript实现OA请假单上两个日期时间区间相减算出天数,可以去除周末和上班之外的时间(每天8小时)?跪求高手解答,感激不尽

解决方案 »

  1.   

    不知道是不是你说的那样 基本 算出了天数(不包括周末)
    var days = diffDate( new Date( 2012 , 11 , 5 ) , new Date( 2012 , 11 , 10 ) );
    function diffDate ( sd , ed ){//sd:开始时间;ed:结束时间;
    if( !sd instanceof Date && ed instanceof Date ){
    return false;
    }
    var realDiff = 0;
    for( var i = 0 ; i <= eds.diffDate( sd ) ; i++ ){
    var tempDate = sd.addDate( i );
    if( [0,6].indexOf(tempDate.getDay()) == -1 ){
    realDiff++;
    }
    }
    return realDiff;
    }

    Date.prototype.diffDate = function( sd ){//两个日期相差的天数
    var st = sd.getTime(),et = this.getTime();
    if( st - et > 0 ) return 0;
    var sds = parseFloat(st / (3600*24*1000)).toFixed(0),eds = parseFloat(et / (3600*24*1000)).toFixed(0);
    return eds - sds;
    }

    Date.prototype.addDate = function( day ){//增加天数
    return new Date( this.getFullYear() , this.getMonth() , this.getDate() + day );
    }
      

  2.   

    计算日期间的天数(周末,假期自己加判断减除)
     function daysBetween(date1,date2)
     {
         var m=0;
         var oneMinute=1000*60;
         var oneDay=oneMinute*60*24;
         date1.setHours(0);
         date1.setMinutes(0);
         date1.setSeconds(0);
         date2.setHours(0);
         date2.setMinutes(0);
         date2.setSeconds(0);
         var diff=date2.getTime()-date1.getTime();
         return Math.ceil(diff/oneDay);
     }
      

  3.   

    这是我今天刚写好的
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title> 请假例子</title>
    </head>
    <script type="text/javascript"> 
    /*根据起始时间和结束日期计算天数*/
    function  DateDiffNoWeekDay(sDate1,sDate2){    
    var sDate1=document.getElementById("date1").value;
    var sDate2=document.getElementById("date2").value;

       //日期格式为yyyy-mm-dd  
       var oDate1  = StringToDate(sDate1);
       var oDate2  = StringToDate(sDate2); 
    /*alert('取整-->'+parseInt((oDate2 - oDate1) / 1000 / 60 / 60 /24));
    alert('非取整-->'+(oDate2 - oDate1) / 1000 / 60 / 60 /24);*/
       if (parseInt((oDate2 - oDate1) / 1000 / 60 / 60 /24)<(oDate2 - oDate1) / 1000 / 60 / 60 /24)
       {
            var days = parseInt((oDate2 - oDate1) / 1000 / 60 / 60 /24)+1;
       }
       else {days = parseInt((oDate2 - oDate1) / 1000 / 60 / 60 /24);}
           
       //var days = parseInt((oDate2 - oDate1) / 1000 / 60 / 60 /24);//获取总的天数
       var days1= parseInt((oDate2 - oDate1) / 1000 / 60 / 60 )%8;  //获取余下的小时
      /*--减去不用上班的时间,即09-18之外的时间--*/
       if(days1>8){
        days1=8;
       }  
       var tempDate = oDate1;
       while(tempDate.getTime() <= oDate2.getTime()){
    //tempDate = addDays(tempDate,2);//加一天
    //days>0表示超过1天,防止出现负数days
    if(checkWeekDay(DateToString(tempDate))& days>0 ){
    //如果是周末,天数减1
     days--;
    }
    tempDate = addDays(tempDate,2);//加一天
       }
       if (days ==1)
       {
    if(parseInt((oDate2-oDate1)/1000/60/60/24)==0& days1==0) {days=1;}
        else{days=0;}/*一天或半天加判断解决天数的问题*/
       }
      
     
          day2.value=days+"天"+days1+"小时";
        }
     
         /*判断是否含有周末,如果是周末 返回true,没有返回false*/
    function checkWeekDay(sDate){
       arys=sDate.split('-');
       arys1=arys[2].split(' ');
    arys2=arys1[1].split(':');
       oDate  =  new Date(arys[0],parseInt(arys[1], 10) - 1,arys1[0],arys2[0],arys2[1],arys2[2]);
       day = oDate.getDay();//判断是否周末
       if(day==0 || day == 6){
    return true;
       }
       return false;
        }
    /*增加天数*/
    function addDays(oDate,days){
         if(days > 0){
                days = days - 1;
            }
         if(days < 0){
                days = days + 1;
            }
         var result = new Date(oDate.getTime()+(days*24 * 60 * 60 * 1000));
             return result;
      }
    /*将字符串转换成日期*/
    function StringToDate(sDate){
    arys=sDate.split('/');
    arys1=arys[2].split(' ');
    arys2=arys1[1].split(':');
    if(arys2[0]>18){
    arys2[0]=18;
    arys2[1]=00;
    arys2[2]=00;
    }
    if(arys2[0]<10){//9
    arys2[0]=10;//9
    arys2[1]=0;
    arys2[2]=0;
    }
            var newDate=new Date(arys[0],parseInt(arys[1], 10) - 1,arys1[0],arys2[0],arys2[1],arys2[2]);
    return newDate;
         }
     /*为一部分月份及日期加前+0*/
     function DateToString(oDate){
            var month = oDate.getMonth()+1;
            var day = oDate.getDate();
    var  hour=oDate.getHours();
    var  mi=oDate.getMinutes();
    var second=oDate.getSeconds();
    //如果月份小于10月则在前面加0
         if(month<10){
               month="0"+month;
            }
    //如果日期小于10号则在前面加0
        if(day<10){
              day = "0"+day;
           }
    if(hour<10){
    //如果小于9点 设置为9点
    if(hour<10){ //9
     hour=10;//9
    }
              hour = "0"+hour;
           }
    //如果大于18点,让他等于18点
    if(hour>18){
    hour=18;
    }
    if(mi<10){
              mi = "0"+mi;
           }
    if(second<10){
              second = "0"+second;
           }
           return oDate.getFullYear() + "-" + month +"-"+ day+" "+hour+":"+mi+":"+second;
       }
    </script>
    <body>
    <input type="text" id="date1" value="2012/12/28 09:00:00"/>
    <input type="text" id="date2" value="2012/12/31 18:00:00"/>
    <input type="text" id="day2" value=""/>
    <input type="button" onclick="DateDiffNoWeekDay();" value="根据日期时间计算天数" /><br>
    <input type="text" style="height:20px;width:467px" disabled="true" id="11" value="如遇周六周日不参与计算,每天的时间定义为:10:00--18:00,共计8小时." />
    </body>
    </html>