JS计算两个时间段内的工作时间(9:00-18:00)

来源:互联网 发布:淘宝店轮播图片制作 编辑:程序博客网 时间:2024/05/22 11:58

一、前言:

由于工作需要,需要计算两个时间段内的工时,只算正常工作时间的,精确到分钟,所以就写了个函数,没怎么优化,测试了几次发现计算有点误差,先用着,将它记下来,以便以后使用。

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>    <label>日期一:<input type="text" id="date1" value="2016/10/27 09:00:00"></label>    <label>日期二:<input type="text" id="date2" value="2016/10/28 09:00:00"></label>    <p id="content"></p>    <p><button onclick="calculate()">计算</button></p>    <label>hours:<input type="number" id="hours" value=""></label>    <label>mins:<input type="number" id="mins" value=""></label>    <p id="content1"></p>    <p><button onclick="calculate()">计算</button></p><script>    var daySecs=24*60*60*1000;    var hourSecs=60*60*1000;    var minSecs=60*1000;        function getDifDate(date1,date2){            if(date1>date2)return 0;            var dateF=new Date(date1);            var dateN=new Date(date2);            var validTime=dateN-dateF;            var totalTime=0;            console.log("总的时间差:"+validTime);            //前段时间的时和分            var dateFH=dateF.getHours();            var dateFM=dateF.getMinutes();            //后段时间的时和分            var dateNH=dateN.getHours();            var dateNM=dateN.getMinutes();          var time=0;            while (Math.floor(dateF.getTime()/minSecs)<Math.floor(dateN.getTime()/minSecs)){                //前段时间的时和分              dateFH=dateF.getHours();              dateFM=dateF.getMinutes();                //后段时间的时和分              dateNH=dateN.getHours();              dateNM=dateN.getMinutes();                validTime=dateN-dateF;                if(dateN.getDay()==0||dateN.getDay()==6){//结束时间是周末                    time=dateNH*hourSecs+dateNM*minSecs;                    dateN.setTime(dateN.getTime()-time-6*hourSecs-minSecs);                    totalTime+=minSecs;                    continue;                }                time=daySecs-dateFH*hourSecs-dateFM*minSecs;                if(dateF.getDay()==0||dateF.getDay()==6){//开始时间是周末                    dateF.setTime(dateF.getTime()+time+9*hourSecs);                    continue;                }                if(Math.abs(dateF.getDate()-dateN.getDate())>=1){//跨天                    if(dateF.getHours()<9){//九点前开始                        totalTime+=8*hourSecs;                        dateF.setTime(dateF.getTime()+time+9*hourSecs);                        continue;                    }                    if(dateF.getHours()>=9&&dateF.getHours()<12){//上午开始                        totalTime+=18*hourSecs-(dateFH*hourSecs+dateFM*minSecs+hourSecs);                        dateF.setTime(dateF.getTime()+time+9*hourSecs);                        continue;                    }                    if(dateF.getHours()>=12&&dateF.getHours()<13){//中午休息时间开始                        totalTime+=5*hourSecs;                        dateF.setTime(dateF.getTime()+time+9*hourSecs);                        continue;                    }                    if(dateF.getHours()>=13&&dateF.getHours()<18){//下午开始                        totalTime+=18*hourSecs-(dateFH*hourSecs+dateFM*minSecs);                        dateF.setTime(dateF.getTime()+time+9*hourSecs);                        continue;                    }                    if(dateF.getHours()>=18){//加班时间                        dateF.setTime(dateF.getTime()+time+9*hourSecs);                    }                }else {//不跨天                    if(judgeSection(dateNH,dateNM)>9&&judgeSection(dateFH,dateFM)<=18){                        if(dateFH<9&&judgeSection(dateNH,dateNM)<=12){ //9-12                            totalTime+=(dateNH*hourSecs+dateNM*minSecs)-9*hourSecs;                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if(dateFH<9&&judgeSection(dateNH,dateNM)<=13){//9-13                            totalTime+=3*hourSecs;                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if(dateFH<9&&judgeSection(dateNH,dateNM)<=18){//9-18                            totalTime+=(dateNH*hourSecs+dateNM*minSecs)-10*hourSecs;                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if(dateFH<9&&judgeSection(dateNH,dateNM)>18){//9-加班                            totalTime+=8*hourSecs;                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if((dateFH>=9&&judgeSection(dateNH,dateNM)<=12)||(dateF.getHours()>=13&&judgeSection(dateNH,dateNM)<=18)){                            totalTime+=(dateNH*hourSecs+dateNM*minSecs)-(dateFH*hourSecs+dateFM*minSecs);                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if(dateFH>=9&&judgeSection(dateNH,dateNM)<=13){ //9-12                            totalTime+=12*hourSecs-(dateFH*hourSecs+dateFM*minSecs);                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if(dateFH>=9&&dateFH<=12&&judgeSection(dateNH,dateNM)<=18){                            totalTime+=(dateNH*hourSecs+dateNM*minSecs)-(dateFH*hourSecs+dateFM*minSecs)-hourSecs;                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if(dateFH>=9&&dateFH<=12&&judgeSection(dateNH,dateNM)>18){                            totalTime+=18*hourSecs-(dateFH*hourSecs+dateFM*minSecs)-hourSecs;                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if(dateFH>=12&&dateFH<13&&judgeSection(dateNH,dateNM)<=18&&judgeSection(dateNH,dateNM)>13){//13-18                            totalTime+=(dateNH*hourSecs+dateNM*minSecs)-13*hourSecs;                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if(dateFH>=13&&judgeSection(dateNH,dateNM)<=18){                            totalTime+=(dateNH*hourSecs+dateNM*minSecs)-(dateFH*hourSecs+dateFM*minSecs);                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                        if(dateFH>=13&&judgeSection(dateNH,dateNM)>18){                            totalTime+=18*hourSecs-(dateFH*hourSecs+dateFM*minSecs);                            dateF.setTime(dateF.getTime()+daySecs);                            continue;                        }                    }                        dateF.setTime(dateF.getTime()+daySecs);//非工作区间                }            }            return totalTime;        }        function judgeSection(hours,mins) {            var section=hours*hourSecs+mins*minSecs;            return Math.ceil(section/hourSecs);        }        function calculate() {            var date1=document.getElementById("date1").value;            var date2=document.getElementById("date2").value;            var hours=document.getElementById("hours").value;            var mins=document.getElementById("mins").value;            var section=judgeSection(hours,mins);            document.getElementById("content1").innerHTML=section;            var secs=getDifDate(date1,date2);            var textnode=document.createTextNode("总时间:"+(Math.floor(secs/daySecs))+"天"+(Math.floor(secs/hourSecs))+"时"+(Math.floor(secs/minSecs))+"分");            document.getElementById("content").innerHTML="";            document.getElementById("content").appendChild(textnode);            console.log("总时间:"+(Math.floor(secs/daySecs))+"天"+(Math.floor(secs/hourSecs))+"时"+(Math.floor(secs/minSecs))+"分");        }</script></body></html>

运行效果:
这里写图片描述

显示的天是按满24小时算一天,小时和分也都不是取余后的数据,注意一下。可能有没考虑到的情况。

0 0
原创粉丝点击