现在遇到一个非常棘手的问题:单位做一个请假系统,选择两个日期,计算出请假天数,需要排除周六周日两天来计算,目前出现以下问题:7月内选择2个日期是正常的,8月内选择2个日期计算错误(周三周四没有算进来),用的是my97控件。下面是代码:function Computation(){    
  var aDate, oDate1, oDate2, iDays;    
  var sDate1=document.getElementById("d4311").value;    
  var sDate2=document.getElementById("d4312").value;  
  aDate = sDate1.split("-");      
  oDate1 = new Date(aDate[1] + '-' + aDate[0] + '-' + aDate[2]);    
  aDate = sDate2.split("-");      
  oDate2 = new Date(aDate[1] + '-' + aDate[0] + '-' + aDate[2]);      
  iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 /24)+1;  
  var weekday=0;
  for(var i=1;i<iDays;i++)
  {
var time=new Date(oDate1.getYear(),oDate1.getMonth(),oDate1.getDay()+i);
if(time.getDay()==0||time.getDay()==6){
weekday++;}
  }
   //alert(iDays);
  var lDays=iDays-weekday;
  document.getElementById("dateresult").innerText=lDays;  
<tr>
        <td width="9" background="../images/tab_12.gif">&nbsp;</td>
        <td>
        <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="b5d6e6" onmouseover="changeto()"  onmouseout="changeback()">
          <tr align="left">
            <td width="15%" background="../images/bg1.gif" bgcolor="#FFFFFF">Casual to be taken on:</td>  
            <td width="15%" bgcolor="#FFFFFF">From:
             <input id="d4311" class="required" type="text" name="fdate" onFocus="WdatePicker({dateFmt:'d-M-yyyy',maxDate:'#F{$dp.$D(\'d4312\')}',disabledDays:[0,6]})"/>
            </td>    
            <td width="15%" bgcolor="#FFFFFF">To:
             <input id="d4312" class="required" type="text" name="tdate" onFocus="WdatePicker({dateFmt:'d-M-yyyy',minDate:'#F{$dp.$D(\'d4311\')}',disabledDays:[0,6]})"  onblur="javascript:Computation();"/>
            </td>
            <td width="55%" bgcolor="#FFFFFF">Days: <br/><input name="days" id="dateresult" size="20" type="text" value="0" readonly="readonly"></td>
          </tr>
        </table>
        </td>
        <td width="8" background="../images/tab_15.gif">&nbsp;</td>
      </tr>
JavaScriptHTML

解决方案 »

  1.   

    看你逻辑貌似没有问题,先计算出来天差数,再减掉周六日。不过,如果sDate1是26号,for里面i=6时,time.getDay会不会有问题呢?
      

  2.   

    思路:日期差除以7取整,然后乘以2。若结束日期的星期数比其实日期早,则加一
    ----------------------
    伪代码(算头不算尾的,如果算头算尾自行加一):
    function dateDiff(d1,d2){
            return d1到d2的天数;
    }
    function getDay(d){
            return 星期数//例如星期日返回0,星期一返回1……
    }
    function main(){
            while(getDay(d1)==0||getDay(d1)==6) d1++;//周末开始请假算作周一
            while(getDay(d2)==0||getDay(d2)==6) d2--;//周末结束算作上周五

            int a = dateDiff(d1,d2)
            int b = a/7
            if(getDay(d2)<getDay(d1)) b++;
            return a-2*b;
    }
    --------------
    例一,本周五请假、下周一上班,a=3  >  b=0  >  b=1  >  a-2*b=1
    例二,本周一请假、下周五上班,a=11  >  b=1  >  b=1  >  a-2*b=9
    例三,本周五请假、本周六上班(周六你上个屁的班啊),补上周六、补上周日,转化为例一
    例四,本周六请假、下下周五上班,剔除本周六、剔除本周日,转化为例二
    --------------
    其实关键就在于加红的两句:
    前者将不计算入请假时间的“请假时间”排除在外,避免了,不完整的周末“零头”
    后者弥补了因为取整而导致漏计的“短周末”(即包含周末却不足7天的,见例一)
      

  3.   

    iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 /24)+1; 
    --> 这是算含周六日的天数?日期不能直接减吧?感觉没考虑每月的天数吧?
    例如:oDate1=20130101,oDate2=20130201,直接减岂不相差100天?