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
- JS计算两个时间段内的工作时间(9:00-18:00)
- 计算两个时间段内的记录
- java计算两个时间段内的交集天数
- JavaScript 计算两个日期时间段内的日期
- 计算两个日期之间的工作时间
- js-由两个时间段返回 时间段内联系时间
- 对两个时间求差值,以及计算时间段内周六、周日的天数
- 两个时间段内的所有年月
- orale 查询两个时间段内的数据
- java计算两个时间段的重合天数
- iOS 计算两个时间段的差值
- java计算两个时间段的精确天数
- 应用moment.js辅助计算工作时间
- Oracle 查询两个时间段内的所有日期列表
- 计算两个时间段相差天数
- SQL计算两个时间段的差,精确到秒(可用于倒计时)
- Oracle中计算两个时间段的时分秒天周数语句
- PHP 计算两个时间段之间交集的天数
- 文件操作
- Mac下安装HBase及详解
- iOS中 addChildViewControllers 调整tableView位置
- Centos 6.5 关闭防火墙的步骤
- python爬虫"Hello World"级入门实例(二),使用json从中国天气网抓取数据
- JS计算两个时间段内的工作时间(9:00-18:00)
- Android之AsyncTask详解
- VS2015安装+OpenGL环境配置及测试
- Android-JavaWeb ——版本控制 git和svn
- Velocity 基础语法,别处贴的 侵立删
- vim 多窗口编辑
- 课程学习方法体系
- functions setting in R
- DataGridView的VirtualMode,在大容量数据加载时特别有用