本帖最后由 me_meihuo 于 2011-04-28 16:59:41 编辑

解决方案 »

  1.   

    http://yishimengying.blog.163.com/blog/static/1010875702011124103933400/
      

  2.   

    <!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><body>
    <script type="text/javascript">
    var str1 = '2011-04-28 14'; //开始时间字符串
    var str2 = '2011-04-29 15'; //结束时间字符串//开始构造两个日期对象
    var datetime1 = new Date(), datetime2 = new Date();
    datetime1.setFullYear(str1.substr(0,4),str1.substr(5,2),str1.substr(8,2));
    datetime2.setFullYear(str2.substr(0,4),str2.substr(5,2),str2.substr(8,2));
    datetime1.setMilliseconds(0);
    datetime2.setMilliseconds(0);var date1 = datetime1.setHours(0,0,0); //开始日期,毫秒表示
    var date2 = datetime2.setHours(0,0,0); //结束日期,毫秒表示datetime1.setHours(str1.substr(11,2),0,0);
    datetime2.setHours(str2.substr(11,2),0,0);var travelHours = 0; //保存出差小时数
    if (datetime2 < datetime1) alert('结束时间不能小于开始时间!');
    else {
    //判断是否同一天
    if (date2 == date1) alert('提示:如您的出差时间小于1天,请填写外出单!');
    else {
    travelHours += (date2 - date1) / 1000 / 60 / 60 / 24 * 8 - 8; if (parseInt(datetime1.getHours()) <= 8) travelHours += 8;
    else {
    if (parseInt(datetime1.getHours()) <= 12) travelHours += 12 - parseInt(datetime1.getHours());
    else {
    if (parseInt(datetime1.getHours()) <= 17) travelHours += 17 - parseInt(datetime1.getHours());
    }
    } if (parseInt(datetime2.getHours()) >= 17) travelHours += 8;
    else {
    if (parseInt(datetime2.getHours()) >= 13) travelHours += 4 + parseInt(datetime2.getHours()) - 13;
    else {
    if (parseInt(datetime2.getHours()) >= 8) travelHours += parseInt(datetime2.getHours()) - 8;
    }
    } alert('出差时间:' + travelHours + '小时!\n' + '我勒个去啊,这孙子也太抠了!!');
    }
    }
    </script>
    </body>
    </html>
      

  3.   

    var str1 = '2011-04-28 14';        //开始时间字符串
    var str2 = '2011-05-01 15';        //结束时间字符串如果是这样的话,计算出来是两者相差4天!先把日期用.getTime()方法转换为毫秒的,难道JS认为4月份有31天?
      

  4.   

    代码没经过测试。不过逻辑是这样javascript的API发现在js中月份的范围是0-11即从0开始(0表示一月份),所以也就会出现我前面说的2010-03-31被js看成是2010-04-01,其实是这么回事:2010-03-31在js中表示的时间是2010年4月31日而不是2010-3-31,我们知道4月份是没有31日的,所以js会默认地帮你向后移一天也即2010-4-1(注意这里表示的时间是2010年5月1日)
    因此我们只要在原来的月份上减去一,然后通过getTime()获取毫秒数,并两者相减,再除以一天的毫秒数即得到所谓的相隔天数!!!
    EG:
        var start = $("#startDate").val();
        var end = $("#endDate").val();
        if(!start.match(new RegExp('^[0-9]+-[0-9]+-[0-9]+.*$'))){
            alert("Please choosh the start date!");
            return;
        }
        if(!end.match(new RegExp('^[0-9]+-[0-9]+-[0-9]+.*$'))){
            alert("Please choosh the end date!");
            return;
        }
        if(reason==''){
            alert("Please input reason!");
            return;
        }
        var startTmp = start.split("-");
        var endTmp = end.split("-");
        var dS = new Date(startTmp[0],parseInt(startTmp[1])-1,startTmp[2]);//注意这里减除一
        var dE = new Date(endTmp[0],parseInt(endTmp[1])-1,endTmp[2]);//注意这里减除一
        var nowDate = new Date();
        var nowTmp = new Date(nowDate.getYear()+1900,nowDate.getMonth(),nowDate.getDate());
        if((nowTmp-dS)>0){
            alert("Start date can't early today!");
            return;
        }
        var distance = (dE-dS)/(1000*60 * 60);
     
    这样就可以了,不用向上面的这么复杂
    核心就在上面的时间月份是从1月开始的(与js默认的月份从0开始不一致!!!)参考资料: http://wenwen.soso.com/z/q194655751.htm
      

  5.   


    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
        <title>日期</title>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">    <script type="text/javascript">        window.onload = function()
            {
                //注册函数
                document.getElementById("test").onclick= function()            {
                   showTime();
                }
            }        function showTime()
            {
             //校验正则
    var reg = /(\d{4})-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2})/;

    var d1 = document.getElementById("d1").value;   
                var d2 = document.getElementById("d2").value;   
    if(reg.test(d1)||reg.test(d2)) //校验最好再全点,防止出现2011-13-98 12:80这种不合法的。这里就不写了
    {
    alert("xx,算不出了,你自己算吧!");
    return;
    }
    var match1 = d1.match(reg);
    var match2 = d2.match(reg);
                var date1 = new Date(match1[1],parseInt(match1[2])-1,parseInt(match1[3]),parseInt(match1[4]),parseInt(match1[5]));
                var date2 = new Date(match2[1],parseInt(match2[2])-1,parseInt(match2[3]),parseInt(match2[4]),parseInt(match2[5]));
                
                var chazhi = date2.getTime()-date1.getTime();

                if(chazhi>0)
              {
                alert("两个日期相差:"+ parseInt(chazhi/(60*60*1000))+"小时"+(chazhi/(60*1000))%60+"分钟");
              }else
              {
                alert("xx,不识字啊你,开始和结束都分不清!");
              }      
            }    </script>
    </head>
    <body>
        开始时间:<input type="text" name="d1" id="d1" value="2011-03-19 10:00"/><br>    结束时间:<input type="text" name="d2" id="d2" value="2011-03-19 19:00"/><br>    <button id="test">测试</button>
        
    </body>
    </html>
      

  6.   

    上面判断写错了:if(!reg.test(d1)||!reg.test(d2)) //校验最好再全点,防止出现2011-13-98 12:80这种不合法的。这里就不写了
    {
    alert("xx,算不出了,你自己算吧!");
    return;
    }
      

  7.   

    <!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><body>
    <script type="text/javascript">
    var str1 = '2011-04-28 09'; //开始时间字符串
    var str2 = '2011-04-30 17'; //结束时间字符串//开始构造两个日期对象
    var datetime1 = new Date(), datetime2 = new Date();
    datetime1.setFullYear(str1.substr(0,4),str1.substr(5,2),str1.substr(8,2));
    datetime2.setFullYear(str2.substr(0,4),str2.substr(5,2),str2.substr(8,2));
    datetime1.setMilliseconds(0);
    datetime2.setMilliseconds(0);var date1 = datetime1.setHours(0,0,0); //开始日期,毫秒表示
    var date2 = datetime2.setHours(0,0,0); //结束日期,毫秒表示datetime1.setHours(str1.substr(11,2),0,0);
    datetime2.setHours(str2.substr(11,2),0,0);var travelHours = 0; //保存出差小时数
    if (datetime2 < datetime1) alert('结束时间不能小于开始时间!');
    else {
    //判断是否同一天
    if (date2 == date1) alert('提示:如您的出差时间小于1天,请填写外出单!');
    else {
    travelHours += (date2 - date1) / 1000 / 60 / 60 / 24 * 8 - 8; if (parseInt(datetime1.getHours()) <= 8) travelHours += 8;
    else {
    if (parseInt(datetime1.getHours()) <= 12) travelHours += 4 + 12 - parseInt(datetime1.getHours());
    else {
    if (parseInt(datetime1.getHours()) <= 17) travelHours += 17 - parseInt(datetime1.getHours());
    }
    } if (parseInt(datetime2.getHours()) >= 17) travelHours += 8;
    else {
    if (parseInt(datetime2.getHours()) >= 13) travelHours += 4 + parseInt(datetime2.getHours()) - 13;    //3楼代码这里少算了4个小时。。但是跨月这个。。再想想办法
    else {
    if (parseInt(datetime2.getHours()) >= 8) travelHours += parseInt(datetime2.getHours()) - 8;
    }
    } alert('出差时间:' + travelHours + '小时!\n' + '我勒个去啊,这孙子也太抠了!!');
    }
    }
    </script>
    </body>
    </html>
      

  8.   

    <!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><body>
    <script type="text/javascript">
    var str1 = '2011-04-28 09';        //开始时间字符串
    var str2 = '2011-04-30 17';        //结束时间字符串//开始构造两个日期对象
    var datetime1 = new Date(), datetime2 = new Date();
    datetime1.setFullYear(str1.substr(0,4),str1.substr(5,2),str1.substr(8,2));
    datetime2.setFullYear(str2.substr(0,4),str2.substr(5,2),str2.substr(8,2));
    datetime1.setMilliseconds(0);
    datetime2.setMilliseconds(0);var date1 = datetime1.setHours(0,0,0);    //开始日期,毫秒表示
    var date2 = datetime2.setHours(0,0,0);    //结束日期,毫秒表示datetime1.setHours(str1.substr(11,2),0,0);
    datetime2.setHours(str2.substr(11,2),0,0);var travelHours = 0;    //保存出差小时数
    if (datetime2 < datetime1) alert('结束时间不能小于开始时间!');
    else {
        //判断是否同一天
        if (date2 == date1) alert('提示:如您的出差时间小于1天,请填写外出单!');
        else {
            travelHours += (date2 - date1) / 1000 / 60 / 60 / 24 * 8 - 8;        if (parseInt(datetime1.getHours()) <= 8) travelHours += 8;
            else {
                if (parseInt(datetime1.getHours()) <= 12) travelHours += 4 + 12 - parseInt(datetime1.getHours());  //11楼代码作废,加错地方了
                else {
                    if (parseInt(datetime1.getHours()) <= 17) travelHours += 17 - parseInt(datetime1.getHours());
                }
            }        if (parseInt(datetime2.getHours()) >= 17) travelHours += 8;
            else {
                if (parseInt(datetime2.getHours()) >= 13) travelHours += 4 + parseInt(datetime2.getHours()) - 13;
                else {
                    if (parseInt(datetime2.getHours()) >= 8) travelHours += parseInt(datetime2.getHours()) - 8;
                }
            }        alert('出差时间:' + travelHours + '小时!\n' + '我勒个去啊,这孙子也太抠了!!');
        }
    }
    </script>
    </body>
    </html>
      

  9.   


    <!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><body>
    <script type="text/javascript">
    var str1 = '2011-04-28 09'; //开始时间字符串
    var str2 = '2011-04-30 17'; //结束时间字符串//开始构造两个日期对象
    var datetime1 = new Date(), datetime2 = new Date();
    datetime1.setFullYear(str1.substr(0,4),str1.substr(5,2),str1.substr(8,2));
    datetime2.setFullYear(str2.substr(0,4),str2.substr(5,2),str2.substr(8,2));
    datetime1.setMilliseconds(0);
    datetime2.setMilliseconds(0);var date1 = datetime1.setHours(0,0,0); //开始日期,毫秒表示
    var date2 = datetime2.setHours(0,0,0); //结束日期,毫秒表示datetime1.setHours(str1.substr(11,2),0,0);
    datetime2.setHours(str2.substr(11,2),0,0);var travelHours = 0; //保存出差小时数
    if (datetime2 < datetime1) alert('结束时间不能小于开始时间!');
    else {
    //判断是否同一天
    if (date2 == date1) alert('提示:如您的出差时间小于1天,请填写外出单!');
    else {
    travelHours += (date2 - date1) / 1000 / 60 / 60 / 24 * 8 - 8; if (parseInt(datetime1.getHours()) <= 8) travelHours += 8;
    else {
    if (parseInt(datetime1.getHours()) <= 12) travelHours += 4 + 12 - parseInt(datetime1.getHours());  //加错地方了
    else {
    if (parseInt(datetime1.getHours()) <= 17) travelHours += 17 - parseInt(datetime1.getHours());
    }
    } if (parseInt(datetime2.getHours()) >= 17) travelHours += 8;
    else {
    if (parseInt(datetime2.getHours()) >= 13) travelHours += 4 + parseInt(datetime2.getHours()) - 13;
    else {
    if (parseInt(datetime2.getHours()) >= 8) travelHours += parseInt(datetime2.getHours()) - 8;
    }
    } alert('出差时间:' + travelHours + '小时!\n' + '我勒个去啊,这孙子也太抠了!!');
    }
    }
    </script>
    </body>
    </html>
      

  10.   


    我发现你们alert的时候都那么有个性。。嘎嘎。。发了那么多 哪个是测试过可以用的呀?万分感激大家 
      

  11.   

    写了个简单的原型,楼主看看能不能用。
    <script>
    String.prototype.trans=function(){
      var d=this.replace(/([\d{4}])\-([\d{1,2}])-([\d{1,2}])/ig,"$1/$2/$3");
      var _arr1=d.split(' '), _arr2=_arr1[0].split('/'),_s="";
      for (var i=0;i<_arr2.length;i++){  _s+=_s==""?_arr2[i]:"/"+_arr2[i];  }
      d=_s+" "+_arr1[1];
      return d
    }Number.prototype.diffDay=function(){
      var ret1=this<24?this:this%24;
      var ret2=this<24?0:Math.floor(this/24)  
      return [ret2,ret1]//返回两元素数组 0--天数  1--剩余的小时数
    }String.prototype.diffHour=function(starttime){
      var s=new Date(starttime.trans());
      var e=new Date(this.trans());
      return (e.getTime()-s.getTime())/3600/1000
    }//==============================================//调用方法:var s='2011-4-28 14:00:00'; //开始时间字符串
    var e='2011-5-1 15:';       //结束时间字符串var hr=e.diffHour(s);                  alert( "相差:"+hr+" 小时"  )
    var days=hr.diffDay();                 alert( "相差:"+days[0]+" 天 "+days[1]+" 小时"   )
    </script>
      

  12.   


    刚google了一把,好多都在说时间对象转换为毫秒数后相减,然后还要用到Math.floor()取整。。但是,按我的处理,计算日期天数差的时候,先转换为  xxxx-xx-xx 00:00:00.000了,日期相减然后/1000/60/60//24,可以确保计算结果是个整数了,怎么还会出错啊,实在太诡异了,请赐教。
      

  13.   

    <!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><body>
    <script type="text/javascript">
    var str1 = '2011-04-30 09';        //开始时间字符串
    var str2 = '2011-05-01 17';        //结束时间字符串//开始构造两个日期对象
    var datetime1 = new Date(), datetime2 = new Date();
    datetime1.setFullYear(str1.substr(0,4),str1.substr(5,2) - 1,str1.substr(8,2));
    datetime2.setFullYear(str2.substr(0,4),str2.substr(5,2) - 1,str2.substr(8,2));
    datetime1.setMilliseconds(0);
    datetime2.setMilliseconds(0);var date1 = datetime1.setHours(0,0,0);    //开始日期,毫秒表示
    var date2 = datetime2.setHours(0,0,0);    //结束日期,毫秒表示datetime1.setHours(str1.substr(11,2),0,0);
    datetime2.setHours(str2.substr(11,2),0,0);var travelHours = 0;    //保存出差小时数
    if (datetime2 < datetime1) alert('结束时间不能小于开始时间!');
    else {
        //判断是否同一天
        if (date2 == date1) alert('提示:如您的出差时间小于1天,请填写外出单!');
        else {
            travelHours += (date2 - date1) / 1000 / 60 / 60 / 24 * 8 - 8;        if (parseInt(datetime1.getHours()) <= 8) travelHours += 8;
            else {
                if (parseInt(datetime1.getHours()) <= 12) travelHours += 4 + 12 - parseInt(datetime1.getHours());  //加错地方了
                else {
                    if (parseInt(datetime1.getHours()) <= 17) travelHours += 17 - parseInt(datetime1.getHours());
                }
            }        if (parseInt(datetime2.getHours()) >= 17) travelHours += 8;
            else {
                if (parseInt(datetime2.getHours()) >= 13) travelHours += 4 + parseInt(datetime2.getHours()) - 13;
                else {
                    if (parseInt(datetime2.getHours()) >= 8) travelHours += parseInt(datetime2.getHours()) - 8;
                }
            }        alert('出差时间:' + travelHours + '小时!\n' + '我勒个去啊,这孙子也太抠了!!');
        }
    }
    </script>
    </body>
    </html>终于找到问题了,js中月份的数值表示是0~11,设置日期的时候就出错了:
    date.setFullYear(2011,4,30); 这样设置的话,实际上日期对象表示的日期成了2011年5月30日
    上面的代码应该可以使用了,楼主你再测试一下吧。
      

  14.   

    楼上没看我写的设置月份啊!写了个判断上班时间的,一天算8小时<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
        <title>日期</title>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">    <script type="text/javascript">        window.onload = function()
            {
                //注册函数
                document.getElementById("test").onclick= function()
                {
                   showTime();
                }
            }        function showTime()
            {
             //校验正则
    var reg = /(\d{4})-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2})/;

    var d1 = document.getElementById("d1").value;   
    var d2 = document.getElementById("d2").value;   
    if(!reg.test(d1)||!reg.test(d2)) //校验最好再全点,防止出现2011-13-98 12:80这种不合法的。这里就不写了
    {
    alert("xx,算不出来,你自己算吧!");
    return;
    }
    var match1 = d1.match(reg);
    var match2 = d2.match(reg);
    var date1 = new Date(match1[1],parseInt(match1[2])-1,parseInt(match1[3]),parseInt(match1[4]),parseInt(match1[5]));
    var date2 = new Date(match2[1],parseInt(match2[2])-1,parseInt(match2[3]),parseInt(match2[4]),parseInt(match2[5]));

    var start1 = new Date(match1[1],parseInt(match1[2])-1,parseInt(match1[3]),8,0); //早8点
    var end1 = new Date(match1[1],parseInt(match1[2])-1,parseInt(match1[3]),12,0);//中午12点

    var start2 = new Date(match1[1],parseInt(match1[2])-1,parseInt(match1[3]),13,0);//下午13点
    var end2 = new Date(match1[1],parseInt(match1[2])-1,parseInt(match1[3]),17,0);//下午17点

    var start11 = new Date(match2[1],parseInt(match2[2])-1,parseInt(match2[3]),8,0); //早8点
    var end11 = new Date(match2[1],parseInt(match2[2])-1,parseInt(match2[3]),12,0);//中午12点

    var start22 = new Date(match2[1],parseInt(match2[2])-1,parseInt(match2[3]),13,0);//下午13点
    var end22 = new Date(match2[1],parseInt(match2[2])-1,parseInt(match2[3]),17,0);//下午17点

    //算法 两个日期0点之间相差小时数 - 多算的小时数(开始时间在上班时间内的小时数) + 少算的小时数(结束时间在上班时间内的小时数)

    //先算整数小时数 =天数*8
    var dayshour = 0;
    var duosuan = 0;
    var shaosuan = 0;

    var sdate = new Date(match1[1],parseInt(match1[2])-1,parseInt(match1[3]),0,0); //开始时间的0点
    var edate = new Date(match2[1],parseInt(match2[2])-1,parseInt(match2[3]),0,0); //结束时间的0点

    dayshour = ((edate.getTime()-sdate.getTime())/(24*60*60*1000))*8 ; //总共小时数

    //比较开始,求多算
    if(date1.getTime()<=start1.getTime())
    {
    duosuan = 0;
    }else if(date1.getTime()<=end1.getTime())
    {
    duosuan = (date1.getTime()-start1.getTime())/(60*60*1000);
    }else if(date1.getTime()<=start2.getTime())
    {
    duosuan = (end1.getTime()-start1.getTime())/(60*60*1000);
    }else if(date1.getTime()<=end2.getTime())
    {
    duosuan = (date1.getTime()-start1.getTime()-(start2.getTime()-end1.getTime()))/(60*60*1000);
    }else
    {
    duosuan = (end2.getTime()-start1.getTime()-(start2.getTime()-end1.getTime()))/(60*60*1000);
    }

    //比较结束,求少算
    if(date2.getTime()<=start11.getTime())
    {
    shaosuan = 0;
    }else if(date2.getTime()<=end11.getTime())
    {
    shaosuan = (date2.getTime()-start11.getTime())/(60*60*1000);
    }else if(date2.getTime()<=start22.getTime())
    {
    shaosuan = (end11.getTime()-start11.getTime())/(60*60*1000);
    }else if(date2.getTime()<=end22.getTime())
    {
    shaosuan = (date2.getTime()-start11.getTime()-(start22.getTime()-end11.getTime()))/(60*60*1000);
    }else
    {
    shaosuan = (end22.getTime()-start11.getTime()-(start22.getTime()-end11.getTime()))/(60*60*1000);
    }

    alert("总小时数:"+(dayshour-duosuan+shaosuan)+"\n"+"合计:"+Math.floor((dayshour-duosuan+shaosuan)/8)+"天"+(dayshour-duosuan+shaosuan)%8+"小时");

    /*
    alert(dayshour);
    alert(duosuan);
    alert(shaosuan);
    return;


    var chazhi = date2.getTime()-date1.getTime();

    if(chazhi>0)
    {
      alert("两个日期相差:"+ parseInt(chazhi/(60*60*1000))+"小时"+(chazhi/(60*1000))%60+"分钟");
    }else
    {
      alert("xx,不识字啊你,开始和结束都分不清!");
    }  
    */    
            }    </script>
    </head>
    <body>
        开始时间:<input type="text" name="d1" id="d1" value="2011-03-19 10:00"/><br>
        结束时间:<input type="text" name="d2" id="d2" value="2011-03-19 19:00"/><br>
        <button id="test">测试</button>
    </body>
    </html>
      

  15.   

    对24楼5500哥们的回复写了一堆文字,一提交正好赶上服务器出问题,TMD。懒得再写了,就写点关键的吧:
    1、赐教不敢当,大家探讨才是;2、无需过多考虑如何完整实现楼主需求,这里的业务逻辑需要仔细推敲。例如:我外出5个小时算不算出差?是填写出差单还是外出单?因为现在高铁这么快,假设我从北京到天津、或上海到江苏路途1个小时足够了,说是外出,我去了外地;说是出差,时间不长。所以这些还是让楼主自己去定夺的好。我们只要帮他把关键的时间差计算做好给他就好了,呵呵。
      

  16.   


        function getDate(dateStr) {
            var arr = dateStr.split(new RegExp("(-| )", "g"));
            return new Date(arr[0],arr[1]-1,arr[2],arr[3]);
        }    function calcWorkTime(begin, end) {
            var d1 = getDate(begin);
            var d2 = getDate(end);
            if (d2 < d1) {
                return 0;
            }
            var begin = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate());
            var end = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate() + 1);        var totalHours = (end - begin) / 1000 / 3600 / 24 * 8;
            if(totalHours < 0){
                totalHours = 0;
                return totalHours;
            }
            if (d2.getHours() <= 17 && d2.getHours() >= 13) {
                totalHours = totalHours - (17 - d2.getHours());
            }
            else if (d2.getHours() <= 12 && d2.getHours() >= 8) {
                totalHours = totalHours - (12 - d2.getHours()) - 4;
            }
            else if (d2.getHours() < 8) {
                totalHours -= 8;
            }        if (d1.getHours() >= 8 && d1.getHours() <= 12) {
                totalHours = totalHours - (d1.getHours() - 8) -4;
            }
            else if (d1.getHours() >= 13 && d1.getHours() <= 17) {
                totalHours = totalHours -( d1.getHours() - 13) - 4;
            }
            else if (d1.getHours > 17) {
                totalHours -= 8;
            }
            return totalHours;
        }
        var hours = calcWorkTime("2011-12-12 4", "2011-12-13 4");
        document.writeln(hours + "小时");没有仔细测试,也没有做数据验证。
      

  17.   


    首先尊重每个回帖的人。
    说下自己的观点,不当之处请多包涵。1.有人问问题说明是他不会才问的,这些问题其他人可能认为很简单,但是对于提问的人来说他想看到的是效果,你说思路他可能不知道怎么实现。
    如:我只写个
     //算法 两个日期0点之间相差小时数 - 多算的小时数(开始时间在上班时间内的小时数) + 少算的小时数(结束时间在上班时间内的小时数)
    他会吗?2.回答问题也是对自己的一种锻炼或者是回顾一下以前的知识。
    3.对于所有的回答大家都可以学习一下,不是说谁的代码一定是最好的,关键是别人实现的思路。toury说的也比较对,不需要对楼主的问题做完全的考虑(因为很多东西都涉及到业务的),只要能把关键的地方实现就好了。但能够完全实现那就更好了。一句话,尊重楼主,尊重所有回帖的人。共同提高(感觉有点大了,包涵包涵!)
      

  18.   

    饿~~~~我发现大家好像都执着于算法,我真佩服!
    不过如果让我做这么一个需求的话,我不会写这么麻烦的算法。
    直接一个AJAX就实现了~
    前台得到对方输入的两个时间段,输入完成以后AJAX提交到后台然后交给数据库来处理得到时间差,返回数据以后回调函数给某个文本域赋值。
    SQL:select datediff(hour,'2011-04-29 9:00:00','2011-04-30 17:00:00')as datediff;
      

  19.   

    我也知道呀 但是此问题出了JS无解 ajax不能在这里用
      

  20.   

    言之有理 的确不会 本来此处有个BUG改了几个小时 我发现写的代码天方夜谭 我粘给你们观摩观摩  var startdate = "";
    var enddate = "";
    var f= 0;
    var alltime=0;//合计出差时间 
      var st= Page.ThisObj('sysToday').value; //申请日期 
        var s =  Page.ThisObj('s').value;// 交接人上次任务时间段 
    var s1 =  Page.ThisObj('s1').value; // 交接人上次任务时间段  

    var startdate= Page.ThisObj('kd').value; // 出差开始日期 
    var enddate= Page.ThisObj('sd').value;//出差结束日期 
    var startHour = strbuquan(Page.ThisObj('starttime_hour').value); //出差开始时刻 
    var endHour = strbuquan(Page.ThisObj('endtime_hour').value); //出差结束时刻 
        allstartdate=startdate+" "+startHour+":00:00";
        allenddate=enddate+" "+endHour+":00:00";
    c=datediff("hour",allstartdate,allenddate);
    f= datediff("day",startdate,enddate);

    //附加操作通过维护表,对数据库数据进行检索
    var ams1=startdate+" "+Page.ThisObj("amstart").value+":00";
    var ame1=startdate+" "+Page.ThisObj("amend").value+":00";
    var pms1=startdate+" "+Page.ThisObj("pmstart").value+":00";
    var pme1=startdate+" "+Page.ThisObj("pmend").value+":00";
    var ams2=enddate+" "+Page.ThisObj("amstart").value+":00";
    var ame2=enddate+" "+Page.ThisObj("amend").value+":00";
    var pms2=enddate+" "+Page.ThisObj("pmstart").value+":00";
    var pme2=enddate+" "+Page.ThisObj("pmend").value+":00";

    //得到维护表数据 
    var sum1=(f-1)*8;
    if(allstartdate<=ams1)
    {
    if(allenddate<=ams2)
    {
    alltime=parseInt(datediff("hour",ams1,ame1))+parseInt(datediff("hour",pms1,pme1));
    }
    else if(allenddate>=ams2&&allenddate<=ame2)
    {
    alltime=parseInt(datediff("hour",ams1,ame1))+parseInt(datediff("hour",pms1,pme1))+parseInt(datediff("hour",ams2,allenddate));
    }
    else if(allenddate>=ame2&&allenddate<=pms2)
    {
    alltime=parseInt(datediff("hour",ams1,ame1))+parseInt(datediff("hour",pms1,pme1))+parseInt(datediff("hour",ams2,ame2));
    }
    else if(allenddate>=pms2&&allenddate<=pme2)
    {
    alltime=parseInt(datediff("hour",ams1,ame1))+parseInt(datediff("hour",pms1,pme1))+parseInt(datediff("hour",ams2,ame2))+parseInt(datediff("hour",pms2,allenddate));
    }
    else if(allenddate>=pme2)
    {
    alltime=parseInt(datediff("hour",ams1,ame1))+parseInt(datediff("hour",pms1,pme1))+parseInt(datediff("hour",ams2,ame2))+parseInt(datediff("hour",pms2,pme2));
    }这其中能看的变量 是我改过的 以前都是var a  var b  var c  所以表示很蛋疼 自己写也没写出来 折磨一夜了  哎  对此我要感谢CCTV  MTV 以及所有帮我解决问题的叔叔阿姨大哥大姐阿猫阿婆们 
      

  21.   

    /*计算两个时间差时长*/
    /*返回时长数组*/
    /*参数 开始时间 结束时间 格式为Date*/
    function etFtimeSplit(etTtimeStart,etTtimeEnd){
    etTtimeEnd=etFtimeSecond(etTtimeEnd);
    if (etTtimeEnd==0)return null;
    etTtimeStart=etFtimeSecond(etTtimeStart);
    if(etTtimeStart==0)return null
    var cc=Math.floor(parseInt(etTtimeEnd-etTtimeStart)/(1000));
    if (cc < 0) return null;var dy=Math.floor(cc/(3600*24));
    var hh=Math.floor((cc-dy*(3600*24))/3600);
    var mm=Math.floor((cc-(hh*3600))/60);
    dd=cc-(hh*3600+mm*60);
    dy=dy<=0?'00':dy<10?"0"+dy:dy;
    dd=dd<=0?'00':dd<10?"0"+dd:dd;
    mm=mm<=0?'00':mm<10?"0"+mm:mm;
    hh=hh<=0?'00':hh<10?"0"+hh:hh;var etKarry=[dy,hh,mm,dd];
    return etKarry; 
    }