当前位置:编程学习 > JAVA >>

在线等,计算两个日期之间的天数,排除周六周日

现在遇到一个非常棘手的问题:单位做一个请假系统,选择两个日期,计算出请假天数,需要排除周六周日两天来计算,目前出现以下问题: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"> </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"> </td>
      </tr>
JavaScript HTML --------------------编程问答-------------------- 看你逻辑貌似没有问题,先计算出来天差数,再减掉周六日。不过,如果sDate1是26号,for里面i=6时,time.getDay会不会有问题呢? --------------------编程问答--------------------
引用 1 楼 ahxuemei 的回复:
看你逻辑貌似没有问题,先计算出来天差数,再减掉周六日。不过,如果sDate1是26号,for里面i=6时,time.getDay会不会有问题呢?


现在就是7月测试没问题,测试8月的时候,周三周四计算为周末了,没有搞懂为什么会变。 --------------------编程问答-------------------- 计算2个日期之间相差的天数,除以7,取整乘以2,取余,根据第一个日期的星期加上这个余数看是否还有星期6和天,然后用总天数减去这2个天数 --------------------编程问答-------------------- 纯前台JS写我也不会,如果让使用后台写就比较轻松了 --------------------编程问答-------------------- 思路:日期差除以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天的,见例一) --------------------编程问答-------------------- 放JS上写,有点无奈 --------------------编程问答-------------------- iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 /24)+1; 
--> 这是算含周六日的天数?日期不能直接减吧?感觉没考虑每月的天数吧?
例如:oDate1=20130101,oDate2=20130201,直接减岂不相差100天? --------------------编程问答--------------------
引用 4 楼 AA5279AA 的回复:
纯前台JS写我也不会,如果让使用后台写就比较轻松了


思路还不是一样吗 --------------------编程问答--------------------
引用 8 楼 hnsy_ys 的回复:
Quote: 引用 4 楼 AA5279AA 的回复:

纯前台JS写我也不会,如果让使用后台写就比较轻松了


思路还不是一样吗

走同样路程的路,你觉得开车方便一些还是骑自行车方便一些呢? --------------------编程问答--------------------
引用 7 楼 KAKUKYOWU 的回复:
iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 /24)+1; 
--> 这是算含周六日的天数?日期不能直接减吧?感觉没考虑每月的天数吧?
例如:oDate1=20130101,oDate2=20130201,直接减岂不相差100天?


现在的问题就是每个月的周六周日的标记0和6在变化,导致无法准确计算天数。 --------------------编程问答-------------------- 换了个思路,终于解决了。
--------------------编程问答--------------------
引用 11 楼 liuicesnow 的回复:
换了个思路,终于解决了。


怎么不共享出来!!! --------------------编程问答--------------------
引用 10 楼 liuicesnow 的回复:
Quote: 引用 7 楼 KAKUKYOWU 的回复:

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


现在的问题就是每个月的周六周日的标记0和6在变化,导致无法准确计算天数。


这是什么意思呢。
周六=6
周日=0 
这个会变化么?
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,