有开始日期 ftdt,结束日期todt,要得到这两个日期除节假日 周末外的天数,
节假日放在一数组中了
var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04];当ftdt=2013-01-17  todt=2013-01-21
得到天数3当ftdt=2013-10-02  todt=2013-10-07
得到天数2得这么写这样一个function?

解决方案 »

  1.   


    function workdays(d1,d2){
      function toD(d){return new Date(d.replace(/-/g,'/')).getTime()/864E5>>0}
      var d,d1=toD(d1),d2=toD(d2),works=0,i=0;
      if(d1>d2){d=d1;d1=d2;d2=d}
      d=new Date(d1).getDay();
      while(d1<=d2) 
        if( (d+d2-d1++)%7%6 ) works++;
      return works;
    }
     
    alert( workdays('2013-1-17','2013-1-21') );
      

  2.   


     <script type="text/javascript">
                   //计算天数差的函数 yyyy-mm-dd (sDate2-sDate1)间的天数 去掉周末         function  DateDiffNoWeekDay(sDate1,  sDate2) {
               // var sDate1 = document.getElementById("date1").value;
               /// var sDate2 = document.getElementById("date2").value;             var sDate1 = "2013-01-13"
                 var sDate2 = "2013-01-21"
                var oDate1 = StringToDate(sDate1);            var oDate2 = StringToDate(sDate2);          
             var days = 1;
            
             var tempDate = oDate1;
            
             while (tempDate.getTime() < oDate2.getTime()) {
                 tempDate=addDays(tempDate,2); //加一天
              
               if(!checkWeekDay(DateToString(tempDate)))
                            {//不是周末
                               days++;
                          }
              }
                       //return days;          alert(days);
             }          //yyyy-mm-dd 加上days天数后返回 yyyy-mm-ddfunction 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;
     }            //yyyy-mm-dd型转成Date
            function StringToDate(sDate){
            var aDate  =  sDate.split("-");
            return new  Date(aDate[1]  +  "-"  +  aDate[2]  +  "-"  +  aDate[0]);
         }
         //Date型转成yyyy-mm-dd
         function DateToString(oDate) {
             var month = oDate.getMonth() + 1;
             var day = oDate.getDate();
             if (month < 10) {
                 month = "0" + month;
             }
             if (day < 10) {
                 day = "0" + day;
             }
             return oDate.getFullYear() + "-" + month + "-" + day;
         }        /*判断是否含有周末,如果是周末 返回true,没有返回false*/
            function checkWeekDay(sDate) {
                aDate = sDate.split('-');
                oDate = new Date(aDate[1] + "-" + aDate[2] + "-" + aDate[0])    
              
                day = oDate.getDay(); //判断是否周末 
                if (day == 0 || day == 6) {
                    return true;
                }
                return false;
            }
           
            
    </script> 这样写,如果2013-01-13    到2013-01-21 得6天才对,但是出来是7天
    如果2013-01-14   到2013-01-21 出来6天是对的?
    那里写错了?
      

  3.   

        var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
        var arr=[];
        var ftdt="2013-10-02",todt="2013-10-07";
        alert(get_fun(ftdt));
        function get_fun(d){
            var a_date=d.split("-"),t_date = new Date();
            d=new Date(a_date[0],a_date[1]-1,a_date[2]);
            t_date.setTime(d.getTime()+1000*60*60*24);
            var nd=t_date.getFullYear()+"-"+("0"+(t_date.getMonth()+1)).slice(-2)+"-"+("0"+t_date.getDate()).slice(-2);
            if (nd!=todt){
                if(Holiday.indexOf(nd)!=-1){
                   arr[arr.length]=nd;
                    return get_fun(nd);
                }else{
                    return get_fun(nd);
                }
            }else{
                //return arr;//得到日期集合
                return arr.length;//得到日期天数
            }
        }
      

  4.   

     嗯写错了,原把转后天数拿来算星期出错了function workdays(d1,d2){
      function toD(d){return Date.parse(d)/864E5>>0} 
      var day=new Date(d1).getDay(),d,
        d1=toD(d1),d2=toD(d2),works=0;
      if(d1>d2){d=d1;d1=d2;d2=d}
      while(d1<=d2) if( (day+d2-d1++)%7%6 ) works++;
      return works;
    }
      

  5.   

    <script>
        var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
        var arr=[];
        var ftdt="2013-01-01",todt="2013-01-10";
        alert(get_fun(ftdt));
        function get_fun(d){
            var a_date=d.split("-"),t_date = new Date();
            d=new Date(a_date[0],a_date[1]-1,a_date[2]);
            t_date.setTime(d.getTime()+1000*60*60*24);
            var nd=t_date.getFullYear()+"-"+("0"+(t_date.getMonth()+1)).slice(-2)+"-"+("0"+t_date.getDate()).slice(-2);
            if (nd!=todt){
                if(Holiday.indexOf(nd)!=-1||t_date.getDay()==0||t_date.getDay()==6){
                    return get_fun(nd);
                }else{
                    arr[arr.length]=nd;
                    return get_fun(nd);
                }
            }else{
                //return arr;//得到日期集合
                return arr.length;//得到日期天数
            }
        }
    </script>刚才忘记了周末计算。
      

  6.   

    改了下,兼容低版本浏览器function workdays(d1,d2){
      function toD(d){return new Date(d.replace(/-/g,'/')) }   
      function ds(d){return d.getTime()/864E5>>0} 
      var day,d,d1=toD(d1),d2=toD(d2),works=0;
      if(d1>d2){d=d1;d1=d2;d2=d}
      day=d1.getDay();
      d1=ds(d1),d2=ds(d2);
      while(d1<=d2)if( (day+d2-d1++)%7%6 ) works++;
      return works;
    }
      

  7.   

    太厉害了,看不大懂,能不能注释下还有如果要排除掉var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04];中的日期,在上面的基础上,有没有比较简洁的方法之前我自己想到的也是
    一天天循环去跟数据里的值 比较 function check(n,a) {
                for (var i = 0, len = a.length; i < len; i++) {
                    if (a[i] == n) {
                        return true;
                    }
                }
                return false;
            } 
      

  8.   

    加了算 Holiday 里的日期 var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];           
     
    function workdays(d1,d2){
      function toD(d){return new Date(d.replace(/-/g,'/')) }   //转成Date对象
      function ds(d){return d.getTime()/864E5>>0} //天数
      var day,d,d1=toD(d1),d2=toD(d2),d0=d1,works=0,o={},i=0;
      for(var i=0,L=Holiday.length;i<L;i++) o[ ds(toD( Holiday[i]))]=1;
      if(d1>d2){d=d1;d1=d2;d2=d} //确保d1<d2
      day=d1.getDay();  //d1星期
      d1=ds(d1),d2=ds(d2);
      while(d1<=d2) 
        if(  (day+d2-d1++)%7%6||o[d1] )works++; //取星期天,六,加Holiday里的
      return works;
    }
      

  9.   

        var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
        function workdays(d1,d2){
            function toD(d){return new Date(d.replace(/-/g,'/')) }   //转成Date对象
            function ds(d){return d.getTime()/864E5>>0} //天数
            var day,d,d1=toD(d1),d2=toD(d2),d0=d1,works=0,o={},i=0;
            for(var i=0,L=Holiday.length;i<L;i++) o[ ds(toD( Holiday[i]))]=1;
            if(d1>d2){d=d1;d1=d2;d2=d} //确保d1<d2
            day=d1.getDay();  //d1星期
            d1=ds(d1),d2=ds(d2);
            while(d1<=d2)
                if(  (day+d2-d1++)%7%6||o[d1] )works++; //取星期天,六,加Holiday里的
            return works;
        }
        var ftdt="2013-01-01",todt="2013-01-10";
        alert(workdays(ftdt,todt));//结果是8天???
    我想严重问题在于function toD(d){return new Date(d.replace(/-/g,'/')) }
    "2012-01-01"==toD("2012/01/01")吗,不是呀!toD("2012/01/01")==2012-2-1
      

  10.   

    "2012-01-01"==toD("2012/01/01") 吗是不等的,toD将字符串转Date对象
    toD("2012-2-1")==toD("2012-02-01")==toD("2012/01/01") 这样是相等的,所以也支持 "2012-2-1"这格式
      var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];           
     
    function workdays(d1,d2){
      function toD(d){return new Date(d.replace(/-/g,'/')) }   //转成Date对象
      function ds(d){return d.getTime()/864E5>>0} //天数
      var day,d,d1=toD(d1),d2=toD(d2),d0=d1,works=0,o={},i=0;
      for(var i=0,L=Holiday.length;i<L;i++) o[ ds(toD( Holiday[i]))]=1;
      if(d1>d2){d=d1;d1=d2;d2=d} //确保d1<d2
      day=d1.getDay();  //d1星期
      d1=ds(d1),d2=ds(d2);
      while(d1<=d2) 
        if( (day+d2-d1++)%7%6&&!o[d1-1] )works++; //取星期天,六,加Holiday里的
      return works;
    }
      

  11.   

    workdays('2013-01-01','2013-01-10') =5 ,应该对了  :)  
      

  12.   


    呵呵,workdays('2013-01-01','2013-01-10') =4
    是对的,
    但是workdays('2013-01-01','2013-01-07') =3是不对的
      

  13.   

    toD("2012-2-1")==toD("2012-02-01")==toD("2012/01/01") 这样是相等的,所以也支持 "2012-2-1"这格式
    =============严重理解错我的意思:toD("2012-02-01")!="2012-02-01" 难道你忘了js里月份要比实现小1吗?所以按你的函数toD("2012-02-01")="2012-03-01"
      

  14.   

    还有你的while()里也有问题
    alert(workdays("2013-01-30","2013-02-01"));//结果是3天!!!,而实现上只有一天2013-1-31
      

  15.   

    alert(workdays("2013-01-30","2013-02-01"));//结果是3天!!!,是正确的啊30  31  1 
      

  16.   

    new Date(year, month, date) 这样是时候 月份要比实现小1
    new Date("yyyy-mm-dd")这样的时候就不用管了-----------------------------
    原是算的是大有问题,再试试 var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];           
    function workdays(d1,d2){
      function toD(d){return new Date(d.replace(/-/g,'/')) }   //转成Date对象
      function ds(d){return d.getTime()/864E5>>0} //天数
      var day,d,d1=toD(d1),d2=toD(d2),d0=d1,works=0,o={},i=0,L;
      for(i=0,L=Holiday.length;i<L;i++) { o[ ds(toD( Holiday[i]))]=1;};
      if(d1>d2){d=d1;d1=d2;d2=d} //确保d1<d2
      day=d1.getDay();  //d1星期
      d1=ds(d1),d2=ds(d2),i=d2-d1+1;
      while(i--) if( (day+i)%7%6 && !o[d1+i] ) works++; //取星期天,六,加Holiday里的
      return works;

    alert( workdays('2013-01-01','2013-01-7') )
     
     
      

  17.   

    试了几个情况 ,暂时没有发现问题啊
    真是太感谢了.
    呵,如果离LZ近,LZ还真放请吃饭来的
      

  18.   


    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default"  EnableEventValidation="false"%><!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 runat="server">
        <title>无标题页</title>
        <script type="text/javascript" src="My97DatePicker/calendar.js" ></script>
        <script type="text/javascript" src="My97DatePicker/config.js" ></script>
        <script type="text/javascript" src="My97DatePicker/WdatePicker.js" ></script> 
        <script type="text/javascript" src="js/jquery.js"></script>
        <style type="text/css">
        .disno{ display:none;}
        body{font-size:12px; 
        }
        .tx{ border:none; text-align:center;font-family:黑体; font-size:20px;  width:115px; }
        
        
        .tx1{ border:none; width: 128px;text-align:center;font-family:黑体; font-size:18px; }
        .inp{ border:1px solid #cccccc; width:100px;}
        
        
        </style>
        <script type="text/javascript">        function CheckDate(source) {
                var row_id = source.id.substr(0, source.id.lastIndexOf('_') + 1);
                var textbox1 = document.getElementById(row_id + 'frdt');
                var textbox2 = document.getElementById(row_id + 'todt');
                      var   a=textbox1.value+" 23:59:59";
                   a=a.replace("-","/");
                   var dateA=new Date(a);
                   var dateNow=new Date();
                   if (Date.parse(dateNow) - Date.parse(dateA) > 0) {
                       alert("开始日期错误");
                       textbox1.focus();
                       return false;
                   }
                   if (textbox2.value!= "") {
                       if (textbox1.value > textbox2.value) {
                           alert("结束日期要比开始日期大");
                           return false;                   }
                   }               var label = document.getElementById(row_id + 'num');
                   label.value = workdays(textbox1.value, textbox2.value)
               }
        
               var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03", "2013-05-01", "2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
               function workdays(d1, d2) {
                   function toD(d) { return new Date(d.replace(/-/g, '/')) }   //转成Date对象 
                   function ds(d) { return d.getTime() / 864E5 >> 0 } //天数 
                   var day, d, d1 = toD(d1), d2 = toD(d2), d0 = d1, works = 0, o = {}, i = 0, L;
                   for (i = 0, L = Holiday.length; i < L; i++) { o[ds(toD(Holiday[i]))] = 1; };
                   if (d1 > d2) { d = d1; d1 = d2; d2 = d } //确保d1<d2 
                   day = d1.getDay();  //d1星期 
                   d1 = ds(d1), d2 = ds(d2), i = d2 - d1 + 1;
                   while (i--) if ((day + i) % 7 % 6 && !o[d1 + i]) works++; //取星期天,六,加Holiday里的 
                   return works;
               }      </script>
           <style media="print" type="text/css"> 
    .Noprint{display:none;} 
    .PageNext{page-break-after: always;} 
    </style> 
        
    </head>
    <body  >
        <form id="form1" runat="server">
            
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
          <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
        <asp:ImageButton ID="ImageButton1" runat="server"  ImageUrl="images/new.gif" CssClass="imgbt" OnClick="ImageButton1_Click"/>
         <asp:ImageButton ID="ImageButton2" runat="server"  ImageUrl="images/del.gif" CssClass="imgbt" OnClick="btnDelete_Click"/>
        
        <asp:hiddenfield runat="server" id="hfID"></asp:hiddenfield>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>   <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"  OnSelectedIndexChanged="GridView1_SelectedIndexChanged"   OnRowCreated="GridView1_RowCreate">
       <Columns>
                        <asp:TemplateField HeaderText="NO." ItemStyle-HorizontalAlign="center">    
                             <ItemTemplate>              
                               <asp:Label runat="server" ID="lblID" Text='<%#Eval("ID") %>'></asp:Label>          
                                 </ItemTemplate>           
                                  <ItemStyle HorizontalAlign="center" />       
                          </asp:TemplateField> 
       
                  <asp:TemplateField HeaderText="开始时间">
                   <ItemTemplate>                  <asp:TextBox ID="frdt" runat="server" CssClass="Wdate" Width="120" Text='<%#Eval("frdt")%>'  onchange="CheckDate(this)">
                       </asp:TextBox>
                       </ItemTemplate>
                    </asp:TemplateField>                  <asp:TemplateField HeaderText="结束日期">
                     <ItemTemplate>
                        <asp:TextBox ID="todt" runat="server" CssClass="Wdate" Width="120" Text='<%#Eval("todt") %>'   onchange="CheckDate(this)">
                       </asp:TextBox>
                    </ItemTemplate>
                    </asp:TemplateField>
                       <asp:TemplateField HeaderText="使用个数">
                     <ItemTemplate>
                                           <asp:TextBox ID="num" runat="server"  Text='<%#Eval("num") %>' BorderWidth="0" Width="10"></asp:TextBox>
                    </ItemTemplate>
                    </asp:TemplateField>
       </Columns>
       </asp:GridView>     </ContentTemplate>
        </asp:UpdatePanel>
     
        </form>
    </body>
    </html>
      

  19.   

    下面是查看的源代码
    <!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><title>
    无标题页
    </title>
        <script type="text/javascript" src="My97DatePicker/calendar.js" ></script>
        <script type="text/javascript" src="My97DatePicker/config.js" ></script>
        <script type="text/javascript" src="My97DatePicker/WdatePicker.js" ></script> 
        <script type="text/javascript" src="js/jquery.js"></script>
        <style type="text/css">
        .disno{ display:none;}
        body{font-size:12px; 
        }
        .tx{ border:none; text-align:center;font-family:黑体; font-size:20px;  width:115px; }
        
        
        .tx1{ border:none; width: 128px;text-align:center;font-family:黑体; font-size:18px; }
        .inp{ border:1px solid #cccccc; width:100px;}
        
        
        </style>
        <script type="text/javascript">
     
            function CheckDate(source) {
                var row_id = source.id.substr(0, source.id.lastIndexOf('_') + 1);
                var textbox1 = document.getElementById(row_id + 'frdt');
                var textbox2 = document.getElementById(row_id + 'todt');
     
     
                var a = textbox1.value + " 23:59:59";
                a = a.replace("-", "/");
                var dateA = new Date(a);
                var dateNow = new Date();
                if (Date.parse(dateNow) - Date.parse(dateA) > 0) {
                    alert("开始日期错误");
                    textbox1.focus();
                    return false;
                }
     
     
                if (textbox2.value != "") {
                    if (textbox1.value > textbox2.value) {
                        alert("结束日期要比开始日期大");
                        return false;
     
                    }
                }
     
     
     
                var label = document.getElementById(row_id + 'num');
                label.value = workdays(textbox1.value, textbox2.value)
     
     
            }
     
     
         
     
     
            var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03", "2013-05-01", "2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
            function workdays(d1, d2) {
                function toD(d) { return new Date(d.replace(/-/g, '/')) }   //转成Date对象 
                function ds(d) { return d.getTime() / 864E5 >> 0 } //天数 
                var day, d, d1 = toD(d1), d2 = toD(d2), d0 = d1, works = 0, o = {}, i = 0, L;
                for (i = 0, L = Holiday.length; i < L; i++) { o[ds(toD(Holiday[i]))] = 1; };
                if (d1 > d2) { d = d1; d1 = d2; d2 = d } //确保d1<d2 
                day = d1.getDay();  //d1星期 
                d1 = ds(d1), d2 = ds(d2), i = d2 - d1 + 1;
                while (i--) if ((day + i) % 7 % 6 && !o[d1 + i]) works++; //取星期天,六,加Holiday里的 
                return works;
            }  
     
     
     
     
     
     
     
        </script>
    </head>
    <body>
          <form name="form1" method="post" action="write.aspx" id="form1">
    <div>
    <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
    <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTY0MDA3MzU0NA8WAh4CdGIyigwAAQAAAP////8BAAAAAAAAAAwCAAAATlN5c3RlbS5EYXRhLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUBAAAAFVN5c3RlbS5EYXRhLkRhdGFUYWJsZQMAAAAZRGF0YVRhYmxlLlJlbW90aW5nVmVyc2lvbglYbWxTY2hlbWELWG1sRGlmZkdyYW0DAQEOU3lzdGVtLlZlcnNpb24CAAAACQMAAAAGBAAAAIsHPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8eHM6c2NoZW1hIHhtbG5zPSIiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJhbnUiPg0KICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbXNkYXRhOnRhcmdldE5hbWVzcGFjZT0iIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9ImZyZHQiIHR5cGU9InhzOnN0cmluZyIgbXNkYXRhOnRhcmdldE5hbWVzcGFjZT0iIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9InRvZHQiIHR5cGU9InhzOnN0cmluZyIgbXNkYXRhOnRhcmdldE5hbWVzcGFjZT0iIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9Im51bSIgdHlwZT0ieHM6c3RyaW5nIiBtc2RhdGE6dGFyZ2V0TmFtZXNwYWNlPSIiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgPC94czplbGVtZW50Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJ0bXBEYXRhU2V0IiBtc2RhdGE6SXNEYXRhU2V0PSJ0cnVlIiBtc2RhdGE6TWFpbkRhdGFUYWJsZT0iYW51IiBtc2RhdGE6VXNlQ3VycmVudExvY2FsZT0idHJ1ZSI+DQogICAgPHhzOmNvbXBsZXhUeXBlPg0KICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6Y29tcGxleFR5cGU+DQogIDwveHM6ZWxlbWVudD4NCjwveHM6c2NoZW1hPgYFAAAA0gI8ZGlmZmdyOmRpZmZncmFtIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIiB4bWxuczpkaWZmZ3I9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLWRpZmZncmFtLXYxIj4NCiAgPHRtcERhdGFTZXQ+DQogICAgPGFudSBkaWZmZ3I6aWQ9ImFudTEiIG1zZGF0YTpyb3dPcmRlcj0iMCIgZGlmZmdyOmhhc0NoYW5nZXM9Imluc2VydGVkIj4NCiAgICAgIDxpZD4xPC9pZD4NCiAgICAgIDxmcmR0IC8+DQogICAgICA8dG9kdCAvPg0KICAgICAgPG51bT4wPC9udW0+DQogICAgPC9hbnU+DQogIDwvdG1wRGF0YVNldD4NCjwvZGlmZmdyOmRpZmZncmFtPgQDAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAIAAAAAAAAA//////////8LFgICAw9kFgICAw9kFgJmD2QWAgIJDzwrABECAA8WBB4LXyFEYXRhQm91bmRnHgtfIUl0ZW1Db3VudAIBZAEQFgAWABYAFgJmD2QWBAIBD2QWBmYPZBYCAgEPDxYCHgRUZXh0BQExZGQCAQ9kFgICAQ8PZBYCHgdvbmNsaWNrBR5XZGF0ZVBpY2tlcih7ZWw6JGRwLiQoJ3R4YicpfSlkAgIPZBYCAgEPD2QWAh8EBR9XZGF0ZVBpY2tlcih7ZWw6JGRwLiQoJ3R4YjEnKX0pZAICDw8WAh4HVmlzaWJsZWhkZBgCBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAgUMSW1hZ2VCdXR0b24xBQxJbWFnZUJ1dHRvbjIFCUdyaWRWaWV3MQ88KwAMAQgCAWQn7tN6hq7HK9fAfvXQwAH7h9ZK4RKWUnTn1KaDp67J1Q==" />
    </div>
     
    <script type="text/javascript"> 
    //<![CDATA[
    var theForm = document.forms['form1'];
    if (!theForm) {
        theForm = document.form1;
    }
    function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }
    //]]>
    </script>
     
     
    <script src="/annual/WebResource.axd?d=J6cOxVqf_YZQOXnh_wyWi9ruyb2AZzXYMVck9-6jd-CmEGYqWLBxiLe8PupQ4OB520a-djoahUMxXwlQkPv6Sb3DmG287C2L4MsBoAQWus41&amp;t=634778696730156250" type="text/javascript"></script>
     
     
    <script src="/annual/ScriptResource.axd?d=IBP3T_emZxg5cFwa2tjrLq2w8UaoWf235Bf-FJ1kdGYbiop5FkK-o8qxaMZZi3J2lPlt8i-lACuuiy7I8FCA0Mc4W0mZolvO_PIIPik90Iat4B2mC5jR1TLvTNAO1zL7Kr2-jjjBoWHMzXKZo-RgP30nmAyCX4etIY_UQTC7FnHC1jn3w_M9lWM-A1jIersg0&amp;t=ffffffff940d030f" type="text/javascript"></script>
    <script type="text/javascript"> 
    //<![CDATA[
    if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax 客户端框架未能加载。');
    //]]>
    </script>
     
    <script src="/annual/ScriptResource.axd?d=ZwyNDQe3fgCBUD2HsrcozcM-IUZ7F40F5gklVlH2reoNUzAjrrF90BNEXHuAF8bZg9mP1pbps2evq64CmFCGIQwPp7TPK7O7mqCY4ndUtJnCd6INuEQ7AxwUpJfiW-vFlYuN_Uiwy9KnnJlTIh5FH8eVhT6fkEkL0iAr458CvpLkbYNV9k3lmbs7UXncOM3D0&amp;t=ffffffff940d030f" type="text/javascript"></script>
         <script type="text/javascript"> 
    //<![CDATA[
    Sys.WebForms.PageRequestManager._initialize('ScriptManager1', 'form1', ['tUpdatePanel1',''], [], [], 90, '');
    //]]>
    </script>
     
          <div id="UpdatePanel1">

        <input type="image" name="ImageButton1" id="ImageButton1" class="imgbt" src="images/new.gif" style="border-width:0px;" />
         <input type="image" name="ImageButton2" id="ImageButton2" class="imgbt" src="images/del.gif" style="border-width:0px;" />
        
        <input type="hidden" name="hfID" id="hfID" />
            <span id="Label1">Label</span>
     
       <div>
    <table cellspacing="0" rules="all" border="1" id="GridView1" style="border-collapse:collapse;">
    <tr>
    <th scope="col">NO.</th><th scope="col">开始时间</th><th scope="col">结束日期</th><th scope="col">使用个数</th>
    </tr><tr onClick="javascript:__doPostBack(&#39;GridView1&#39;,&#39;Select$0&#39;);" style="cursor:hand;">
    <td align="center">              
                               <span id="GridView1_ctl02_lblID">1</span>          
                                 </td><td>  
     
                    <input name="GridView1$ctl02$frdt" type="text" id="GridView1_ctl02_frdt" class="Wdate" onchange="CheckDate(this)" onclick="WdatePicker({el:$dp.$(&#39;txb&#39;)})" style="width:120px;" />
                       </td><td>
                        <input name="GridView1$ctl02$todt" type="text" id="GridView1_ctl02_todt" class="Wdate" onchange="CheckDate(this)" onclick="WdatePicker({el:$dp.$(&#39;txb1&#39;)})" style="width:120px;" />
                    </td><td>
                      
     
                         <input name="GridView1$ctl02$num" type="text" value="0" id="GridView1_ctl02_num" style="border-width:0px;width:10px;" />
     
     
                    </td>
    </tr>
    </table>
    </div>
     
         
    </div>
     
        </form>
    </body>
    </html>
    报的错是
      

  20.   

     <script type="text/javascript">        function CheckDate(source) {
                var row_id = source.id.substr(0, source.id.lastIndexOf('_') + 1);
                var textbox1 = document.getElementById(row_id + 'frdt');
                var textbox2 = document.getElementById(row_id + 'todt');
                var a = textbox1.value + " 23:59:59";
                a = a.replace("-", "/");
                var dateA = new Date(a);
                var dateNow = new Date();
                if (Date.parse(dateNow) - Date.parse(dateA) > 0) {
                    alert("开始日期错误");
                    textbox1.focus();
                    return false;
                }
                if (textbox2.value != "") {
                    if (textbox1.value > textbox2.value) {
                        alert("结束日期要比开始日期大");
                        return false;                }
                }            var label = document.getElementById(row_id + 'num');
                label.value = workdays(textbox1.value, textbox2.value)
            }
            function workdays(d1, d2) {
                function toD(d) { return new Date(d.replace(/-/g, '/')) }
                function ds(d) { return d.getTime() / 864E5 >> 0 }
                var day, d, d1 = toD(d1), d2 = toD(d2), works = 0;
                if (d1 > d2) { d = d1; d1 = d2; d2 = d }
                day = d1.getDay();
                d1 = ds(d1), d2 = ds(d2);
                while (d1 <= d2) if ((day + d2 - d1++) % 7 % 6) works++;
                return works;
            }
        </script>
    如果用之前没有判断节假日的JS,就不会报错下面是后台对应的C#代码using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Drawing;
    using System.Data;public partial class write : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {            DataTable tb = new DataTable("anu");
                DataColumn dc1 = new DataColumn("id", Type.GetType("System.String"));
                DataColumn dc2 = new DataColumn("frdt", Type.GetType("System.String"));
                DataColumn dc3 = new DataColumn("todt", Type.GetType("System.String"));
                DataColumn dc4 = new DataColumn("num", Type.GetType("System.String"));            tb.Columns.Add(dc1);
                tb.Columns.Add(dc2);
                tb.Columns.Add(dc3);
                tb.Columns.Add(dc4);
                DataRow dr = tb.NewRow();
                dr["id"] = "1";
                dr["frdt"] = "";
                dr["todt"] = "";
                dr["num"] = "0";            tb.Rows.Add(dr);
                ViewState["tb"] = tb;
                GridView1.DataSource = tb;            GridView1.DataBind();
                TextBox txb;
                TextBox txb1;
                for (int i = 0; i < GridView1.Rows.Count; i++)
                {
                    txb = (TextBox)GridView1.Rows[i].FindControl("frdt");                txb.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb')})");
                    txb1 = (TextBox)GridView1.Rows[i].FindControl("todt");                txb1.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb1')})");
                }
            }
        }
            
        protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
        {
            
            
            TextBox txb;
            TextBox txb1;
            TextBox shownum;
            DataTable tb = new DataTable("anu");
            DataColumn dc1 = new DataColumn("id", Type.GetType("System.String"));
            DataColumn dc2 = new DataColumn("frdt", Type.GetType("System.String"));
            DataColumn dc3= new DataColumn("todt", Type.GetType("System.String"));
            DataColumn dc4 = new DataColumn("num", Type.GetType("System.String"));        tb.Columns.Add(dc1);
            tb.Columns.Add(dc2);
            tb.Columns.Add(dc3);
            tb.Columns.Add(dc4);
            int j = 0;
               
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                DataRow dr = tb.NewRow();                        txb = (TextBox)GridView1.Rows[i].FindControl("frdt");
                txb1 = (TextBox)GridView1.Rows[i].FindControl("todt");
                shownum = (TextBox)GridView1.Rows[i].FindControl("num");
                Label1.Text = shownum.Text;
                dr["id"] = i+1;
                dr["frdt"] = txb.Text;
                dr["todt"] = txb1.Text;
                dr["num"] = shownum.Text;
                tb.Rows.Add(dr);
                j++;        }        DataRow dr1 = tb.NewRow();
            dr1["id"] = j+1;
            dr1["frdt"] = "";
            dr1["todt"] = "";
            dr1["num"] = "0";        tb.Rows.Add(dr1);
            GridView1.DataSource = tb;
            GridView1.DataBind();
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                txb = (TextBox)GridView1.Rows[i].FindControl("frdt");            txb.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb')})");
                txb1 = (TextBox)GridView1.Rows[i].FindControl("todt");            txb1.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb1')})");
            }
          
                }
       
       protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)    
       {
           GridView1.SelectedRowStyle.BackColor = Color.FromName("#f7e7c0");       GridViewRow GridR = GridView1.SelectedRow;      
          string s = ((Label)GridR.FindControl("lblID")).Text;     
          hfID.Value = s;//将选中行的主键放入隐藏控件中   
         
       }    
        protected void btnDelete_Click(object sender, EventArgs e)   
        {        string id = hfID.Value;       
            //根据id获得这条记录,然后删除  
        TextBox txb;
        TextBox txb1;
        TextBox numshow;
        DataTable tb = new DataTable("anu");
        DataColumn dc1 = new DataColumn("id", Type.GetType("System.String"));
        DataColumn dc2 = new DataColumn("frdt", Type.GetType("System.String"));
        DataColumn dc3 = new DataColumn("todt", Type.GetType("System.String"));
        DataColumn dc4 = new DataColumn("num", Type.GetType("System.String"));    tb.Columns.Add(dc1);
        tb.Columns.Add(dc2);
        tb.Columns.Add(dc3);
        tb.Columns.Add(dc4);
        Label lbid;
        
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
                   txb = (TextBox)GridView1.Rows[i].FindControl("frdt");
            txb1 = (TextBox)GridView1.Rows[i].FindControl("todt");
            numshow = (TextBox)GridView1.Rows[i].FindControl("num");
            lbid = (Label)GridView1.Rows[i].FindControl("lblID");        if (id != lbid.Text)
            {
                DataRow dr = tb.NewRow();
                dr["id"] = lbid.Text;
                dr["frdt"] = txb.Text;
                dr["todt"] = txb1.Text;
                dr["num"] = numshow.Text;            tb.Rows.Add(dr);
            }    }   
        GridView1.DataSource = tb;
        GridView1.DataBind();
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            txb = (TextBox)GridView1.Rows[i].FindControl("frdt");        txb.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb')})");
            txb1 = (TextBox)GridView1.Rows[i].FindControl("todt");        txb1.Attributes.Add("onclick", "WdatePicker({el:$dp.$('txb1')})");
        }    }    protected void GridView1_RowCreate(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Attributes.Add("onClick", "javascript:__doPostBack('" + GridView1.ClientID.Replace("_", "$") + "','Select$" + e.Row.RowIndex + "');");
                e.Row.Attributes.Add("style", "cursor:hand;");
            }
        }}
      

  21.   

    结合fzfei2的方法:<script type="text/javascript">
        var Holiday = ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
        var ftdt="2013-10-01",todt="2013-10-07";
        alert(get_fun(ftdt,todt));
        function get_fun(bd,ed){
            var arr=[];
            function toD(d) { return new Date(d.replace(/-/g, '/')) }
            var e=toD(ed);
            function tml(t){
                var n=new Date();
                n.setTime(toD(t).getTime()+864E5);
                return n.getFullYear()+"-"+("0"+(n.getMonth()+1)).slice(-2)+"-"+("0"+n.getDate()).slice(-2);
            }
            while (toD(bd)<=e){
                var w=toD(bd).getDay();
                if(w!=0&&w!=6&&Holiday.indexOf(bd)==-1)arr[arr.length]=bd;
                bd=tml(bd);
            }
            //alert(arr);//输出符合条件的日期集合
            return arr.length;//得到日期天数
        }
    </script>已经测试通过你上面提到的几个日期,其他日期你测试一下。
      

  22.   

    本人最讨厌在公共场所晾代码不写注释了。所有自己写了个带注释的.
    该问题最关键是要理清不同种日期(节假日,周末,工作日(周一到周五))这3个集合之间的关系。
    相信看了下面的韦恩图,代码谁都会写。
       
    <script>//注:要求所有表示日期的字符串的形式为"2013-01-01"
    //var oneDay=24*60*60*1000;
    //所有节假日
    var Holidays= ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
    var OnWorkWeekends=[];      //所有节假日调整而上班的周末日期
    //设置起止日期
    var startDate="2013-01-13";
    var endDate="2013-01-21";
    //function isWeekdays(iDate){ //判断日期是否是工作日
    var dt=new Date(iDate);
    if(dt.getDay()==0||dt.getDay()==6){ 
    return false;
    }
    else {
    return true;
    }
    }
    function getDatesBetweenTime(dateList,startDate1,endDate1){//返回指定日期集合中处于查询时间段内的日期子集
    var dateBetweenTime=new Array();
    for(var k=0;k<dateList.length;k++){
    if(dateList[k]>=startDate1 && dateList[k]<=endDate1){
    dateBetweenTime.push(dateList[k]);
    }
    }
    return  dateBetweenTime;
    }
    //alert(isWeekdays(Date.parse("2013-01-01")));//获得时段内的节假日
    var holidays=getDatesBetweenTime(Holidays,startDate,endDate);
    //获得时段内的应节假日调整而上班的周末日期
    var onWorkWeekends=getDatesBetweenTime(OnWorkWeekends,startDate,endDate); //alert(holidays);
    //alert(onWorkWeekends);alert(computeWorkDays(holidays,onWorkWeekends.length,startDate,endDate));
    function computeWorkDays(holidays,onWorkWeekendsLen,startDate,endDate){//计算startDate~endDate(包括两个端点)中的工作日期数 格式为"2013-01-01" var result=0; //记录结果
    var oneDay=24*60*60*1000;
    var weekdays=[];
    var startDt=Date.parse(startDate);

    var totalDays=(Date.parse(endDate)-Date.parse(startDate))/oneDay;
    var nextDate=startDt;


    //记录查询时间段内所有的属于周一到周五的日期
    for(var i=0;i<totalDays;i++){
    nextDate+=oneDay;

    if(isWeekdays(nextDate)){
    weekdays.push(nextDate);//weekdays中存的是日期的毫秒数
    }
    }
    result=weekdays.length;

    //剔除weekdays中的节假日
    for(var j=0;j<holidays.length;j++){
    if(isWeekdays(Date.parse(holidays[j]))){
    result--;
    }
    } return (result+onWorkWeekendsLen);}</script>
      

  23.   


    如果有些周六  日要算在里面的,改成这样又不对,workd放是周六  日但要算在天数中的
    var Holiday = ["2013-01-01", "2013-02-08", "2013-02-11", "2013-02-12", "2013-02-13", "2013-02-14", "2013-04-04", "2013-05-01", "2013-06-12", "2013-09-19", "2013-10-01", "2013-10-02", "2013-10-03"];
            var workd = ["2013-02-02", "2013-02-03"];
            function workdays(d1, d2) {
                function toD(d) { return new Date(d.replace(/-/g, '/')) }   //转成Date对象 
                function ds(d) { return d.getTime() / 864E5 >> 0 } //天数 
                var day, d, d1 = toD(d1), d2 = toD(d2), d0 = d1, works = 0, o = {}, i = 0, L, p = {};
                for (i = 0, L = Holiday.length; i < L; i++) { o[ds(toD(Holiday[i]))] = 1; };            for (j = 0, W = workd.length; j < W; j++){ p[ds(toD(workd[j]))] = 1; };
                if (d1 > d2) { d = d1; d1 = d2; d2 = d } //确保d1<d2 
                day = d1.getDay();  //d1星期 
                d1 = ds(d1), d2 = ds(d2), i = d2 - d1 + 1;
                while (i--) if ((day + i) % 7 % 6 && !o[d1 + i]) works++; //取星期天,六,加Holiday里的 
                while (j--) {               
                    if (p[d1 + j]) works++;
                }
                return works;
            }
      

  24.   

    什么意思,是说workd[] 中的 日期规定为工作日?
      

  25.   

    输入参数为2013-10-02,2013-10-07时答案为0,是因为忽略了一点:时间实际上为
    2013-10-02 00:00:00,2013-10-07 00:00:00,所有他们的时差实际上为(7-2)-1=4天,而我们实际上要计算的是5天内的工作天数。另外在循环的起点向后推了一天,这也是个小错误。以前错误的地方我下面用红色文字标识出来了,同时把以前的代码注释在后面。先补个图吧。(看了图大家都会明白的。再有小错误,自己修改,想信不会有了)
    <script>//注:要求所有表示日期的字符串的形式为"2013-01-01"
    //var oneDay=24*60*60*1000;
    //所有节假日
    var Holidays= ["2013-01-01", "2013-01-02", "2013-01-03","2013-05-01","2013-09-01", "2013-10-01", "2013-10-02", "2013-10-03", "2013-10-04"];
    var OnWorkWeekends=[];      //所有节假日调整而上班的周末日期
    //设置起止日期
    var startDate="2013-10-02";
    var endDate="2013-10-07";
    //function isWeekdays(iDate){ //判断日期是否是工作日
    var dt=new Date(iDate);
    if(dt.getDay()==0||dt.getDay()==6){ 
    return false;
    }
    else {
    return true;
    }
    }
    function getDatesBetweenTime(dateList,startDate1,endDate1){//返回指定日期集合中处于查询时间段内的日期子集
    var dateBetweenTime=new Array();
    for(var k=0;k<dateList.length;k++){
    if(dateList[k]>=startDate1 && dateList[k]<=endDate1){
    dateBetweenTime.push(dateList[k]);
    }
    }
    return  dateBetweenTime;
    }
    //alert(isWeekdays(Date.parse("2013-01-01")));//获得时段内的节假日
    var holidays=getDatesBetweenTime(Holidays,startDate,endDate);
    //获得时段内的应节假日调整而上班的周末日期
    var onWorkWeekends=getDatesBetweenTime(OnWorkWeekends,startDate,endDate);//alert(holidays);
    //alert(onWorkWeekends);alert(computeWorkDays(holidays,onWorkWeekends.length,startDate,endDate));
    function computeWorkDays(holidays,onWorkWeekendsLen,startDate,endDate){//计算startDate~endDate(包括两个端点)中的工作日期数 格式为"2013-01-01"var result=0; //记录结果
    var oneDay=24*60*60*1000;
    var weekdays=[];
    var startDt=Date.parse(startDate);var totalDays=(Date.parse(endDate)-Date.parse(startDate))/oneDay+1;/*上次的代码少了+1,少算了一天*/
    var nextDate=startDt-oneDay;/*上次的代码中没有-oneDay,而循环是从下一天(nextDate+=oneDay;)开始的,应该是输入参数那一天,所有初始值减一天,即应初始化为开始日期的前一天*/

    //记录查询时间段内所有的属于周一到周五的日期
    for(var i=0;i<totalDays;i++){
    nextDate+=oneDay;
    if(isWeekdays(nextDate)){
    weekdays.push(nextDate);//weekdays中存的是日期的毫秒数
    }
    }
    result=weekdays.length;//剔除weekdays中的节假日
    for(var j=0;j<holidays.length;j++){
    if(isWeekdays(Date.parse(holidays[j]))){
    result--;
    }
    }return (result+onWorkWeekendsLen);}</script>