现在遇到一个非常棘手的问题:单位做一个请假系统,选择两个日期,计算出请假天数,需要排除周六周日两天来计算,目前出现以下问题: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>
JavaScriptHTML
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>
JavaScriptHTML
----------------------
伪代码(算头不算尾的,如果算头算尾自行加一):
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天的,见例一)
--> 这是算含周六日的天数?日期不能直接减吧?感觉没考虑每月的天数吧?
例如:oDate1=20130101,oDate2=20130201,直接减岂不相差100天?