一、前言:
由于工作需要,需要计算两个时间段内的工时,只算正常工作时间的,精确到分钟,所以就写了个函数,没怎么优化,测试了几次发现计算有点误差,先用着,将它记下来,以便以后使用。
<!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小时算一天,小时和分也都不是取余后的数据,注意一下。可能有没考虑到的情况。