您的位置:首页 > Web前端 > JavaScript

JS获取两个日期工作日相差的小时数(不包含周末)----可以指定一天的上班时间

2018-03-07 10:36 901 查看
//获取两个日期相差的工作小时(不包括节假日)
function getHour(StartTime, EndTime) {
StartTime = new Date(StartTime.replace(/-/g, '/'));
EndTime = new Date(EndTime.replace(/-/g, '/'));
var ms = Math.abs(EndTime.getTime() - StartTime.getTime());

//实际工时(天) = 起止日期差 - 周六日数目。
if ((StartTime.getMonth() == EndTime.getMonth()) && (StartTime.getDate() == EndTime.getDate())) {
//若为同一日期
var hour1 = (getDayHour(StartTime.getHours(), StartTime.getMinutes(), EndTime.getHours(), EndTime.getMinutes(), "1")).toFixed(1);
return hour1;
}
else {
//若不为同一日期
var days = Math.floor(ms / 1000 / 60 / 60 / 24) + 1;
var workDayVal = 0;
//工时的余数
var remainder = days % 7;
//工时向下取整的除数
var divisor = Math.floor(days / 7);
var weekendDay = 2 * divisor;

//起始日期的星期,星期取值有(1,2,3,4,5,6,0)
var nextDay = StartTime.getDay();
//从起始日期的星期开始 遍历remainder天
for (var tempDay = remainder; tempDay >= 1; tempDay--) {
//第一天不用加1
if (tempDay == remainder) {
nextDay = nextDay + 0;
} else if (tempDay != remainder) {
nextDay = nextDay + 1;
}
//周日,变更为0
if (nextDay == 7) {
nextDay = 0;
}

//周六日
if (nextDay == 0 || nextDay == 6) {
weekendDay = weekendDay + 1;
}
}
workDayVal = days - weekendDay - 2;
var hour0 = (workDayVal * 8 + getDayHour(StartTime.getHours(), StartTime.getMinutes(), EndTime.getHours(), EndTime.getMinutes(), "0")).toFixed(1);
return hour0;
}
}
//计算开始日期与结束日期两天的请假小时数或者同一天的小时数
//上班时间:早上08:30-12:30 下午:14:00-18:00
function getDayHour(sh, sm, eh, em, type) {
sh = parseInt(sh);
eh = parseInt(eh);
if (type == "0") {
//计算非当天
if (8 <= sh&&sh <= 12) {
sh = 12 - sh + 4 + ((60 - sm) / 60);
} else if (14 <= sh <= 18) {
sh = 18 - sh + ((60 - sm) / 60);
}

if (8 <= eh &&eh<= 12) {
eh = eh - 8 + (em / 60);
} else if (14 <= eh <= 18) {
sh = eh - 14 + 4 + (em / 60);
}

return parseFloat(sh + eh-1);
}
else {

//计算当天

if (sh
4000
== eh) {
//在同一小时
if (sm == em) {
return 0;
} else {
return Math.abs((sm - em) / 60);
}
}
else
{
//不在同一小时

//开始时间在上午时间段,并且结束时间在下午时间段
if ((8 <= sh&& sh<= 12) && (14 <= eh && eh<= 18)) {
if ( sm == 30)
return parseFloat(12 - sh + eh - 14 + (em / 60));
else if (sm < 30) {
return parseFloat(12 - sh + eh - 14 + ((30 - sm) / 60) + (em / 60));

} else if (sm > 30 && sh != 12) {
return parseFloat(12-sh-1+eh - 14 + ((60 - sm) / 60) + 0.5 + (em / 60));
}
}
//开始时间与结束时间都在上午时间段
if ((8 <= sh&&sh <= 12) && (8 <= eh&&eh <= 12)) {

if (sm == em) {
return parseFloat(Math.abs(eh - sh));
} else {

return parseFloat(Math.abs(eh - sh - 1) + (60 - sm) / 60 + em / 60);
}

} else if (14 <= sh&&sh <= 18 && 14 <= eh&&eh <= 18) {
if (sm == em) {
return parseFloat(Math.abs(eh - sh));
} else {

return parseFloat(Math.abs(eh - sh - 1) + (60 - sm) / 60 + em / 60);
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: