首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JS计算工作时间差解决思路

2013-09-24 
JS计算工作时间差本帖最后由 me_meihuo 于 2011-04-28 16:59:41 编辑这是一个出差申请表单~~在表单里自己

JS计算工作时间差
本帖最后由 me_meihuo 于 2011-04-28 16:59:41 编辑 这是一个出差申请表单~~在表单里自己选择一个开始时间和结束时间  然后就自动求出合计出差时间了 时间包括年月日和几点  比如  开始时间2011-12-12 4点 结束2011-12-13 4点 合计出差时间就是8小时 上班时间为8-12  13-17 跪求高手帮忙啊 

var date=0;//综合时间 
var allhour=0;//总小时 
 var startdate = Page.thisObj('TO2CCMX.kd').value;//获取页面的开始日期 
 var starttime = Page.thisObj('TO2CCMX.starttime_hour').value;//获取页面的开始时间 
 
 var enddate = Page.thisObj('TO2CCMX.sd').value;//获取页面的结束日期
 var endtime = Page.thisObj('TO2CCMX.endtime_hour').value;//获取页面的结束时间

 if(enddate<startdate)
 {
 alert("结束时间不能小于开始时间");
 }else if(enddate==startdate)
 {
 alert("提示:如您的出差时间小于1天,请填写外出单!");
 }else
 {
 var startyear = parseInt(startdate.substring(0,8));//截取开始日期/年 
 var endyear = parseInt(startdate.substring(0,8));//截取结束日期/年 

 var startmonth = parseInt(startdate.substring(5,7));//截取开始日期/月 
 var endmonth = parseInt(startdate.substring(5,7));//截取结束日期/月 

 var startday = parseInt(startdate.substring(8,10));//截取开始日期/日 
 var endday = parseInt(enddate.substring(8,10));//截取结束日期/日
            if(startyear==endyear && startmonth==endmonth)
            {
            var day = endday-startday;
            
            if(((8<=starttime && starttime<=12) || (13<=starttime && starttime<=17))&&((8<=endtime && endtime<=12) || (13<=endtime && endtime<=17)))
            {
if(starttime<endtime)
{
allhour=(endtime-starttime)+8;
}else
{
allhour=8;
}
}
            

/*
else if(endtime<starttime)
{
if(((8<=starttime && starttime<=12)&&(13<=starttime && starttime<=17)) && (8<=endtime && endtime<=12)&&(13<=endtime && endtime<=17))


            {
allhour=8-(startime-endtime);
    }else
    {
allhour=8
}
}*/
}
else if(startyear==endyear && startmonth==endmonth && starttime==endtime)
{
 date = endday - startday;
 allhour = date*8;
 }else if(startyear==endyear && startday==endday && starttime==endtime)
 {
date = endhour - starthour;
allhour = date*30*8; 
    }else if(startmonth==endmonth && startday==endday && starttime==endtime)
    {
date = endyear - startyear;
allhour = date*12*30*8;
}


写了半天没写出来啊 纠结死
[解决办法]
代码没经过测试。不过逻辑是这样

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
[解决办法]


<!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>


[解决办法]
<!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>


[解决办法]
写了个简单的原型,楼主看看能不能用。

<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>


[解决办法]
楼上没看我写的设置月份啊!写了个判断上班时间的,一天算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>


[解决办法]

    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 + "小时");


没有仔细测试,也没有做数据验证。

热点排行
Bad Request.