需求:每天8小时, 上午8:00~12:00, 下午13:00~17:00 (排除周六、周日)。
参考的方法getWorkHours存在bug,推荐使用方法2 getWorkHoursV2
js代码:
/**
* 0-15分不算工时
* 15-45算半个小时
* 45-60算一个小时
*/
function carryTime(date) {
if (date.getMinutes() > 0 && date.getMinutes() < 15) {
date.setMinutes(0)
}
if (date.getMinutes() >= 15 && date.getMinutes() < 30) {
date.setMinutes(30)
}
if (date.getMinutes() > 30 && date.getMinutes() < 45) {
date.setMinutes(30)
}
if (date.getMinutes() >= 45) {
date.setHours(date.getHours() + 1)
date.setMinutes(0)
}
return date
}
/**
* 工时计算
* @param {Date} startTime 开始时间
* @param {Date} endTime 结束时间
* @returns 工时时长
*/
export function getWorkHours(startTime, endTime) {
if (startTime >= endTime) return 0
//1 分钟取整
startTime = carryTime(startTime)
endTime = carryTime(endTime)
//2 总天数
var totalTime = Math.floor(((endTime - startTime) / (3600 * 1000)) / 24)
//3 拿初始值赋值给一个临时变量
var tempStartTime = new Date()
tempStartTime.setTime(startTime.getTime())
//4 有效的总天数(不包括周六周日)
while (tempStartTime < endTime) {
if (tempStartTime.getDay() == 6 || tempStartTime.getDay() == 0) {
// 减去周六或者周日
totalTime--
}
tempStartTime.setDate(tempStartTime.getDate() + 1)
}
//5 有效的总小时数
var temp = 0
while (startTime.getHours() * 60 + startTime.getMinutes() != endTime.getHours() * 60 + endTime.getMinutes()) {
if (startTime.getDay() == 6 || startTime.getDay() == 0) {
// 周六周日直接跳过,初始化为下一天早晨8点
startTime.setDate(startTime.getDate() + 1)
startTime.setHours(8)
startTime.setMinutes(0)
continue
}
let tempMinutes = startTime.getHours() * 60 + startTime.getMinutes()
//上午8点到12点,算工时
if (tempMinutes >= 8 * 60 && tempMinutes < (12 * 60)) {
temp += 0.05
}
//上午13点到17点,算工时
if (tempMinutes >= 13 * 60 && tempMinutes < (17 * 60)) {
temp += 0.05
}
startTime.setTime(startTime.getTime() + 0.5 * 3600 * 1000)//每次增加半个小时
}
// 半小时0.05, 一天0.8(每天8小时)
{
totalTime += Math.floor(temp / 0.8)
totalTime += temp % 0.8
totalTime = Math.round(totalTime * 100) / 100
}
var days = Math.floor(totalTime)
var hours = Math.round((totalTime - days) * 100) / 10
// console.log(days + '天', hours + '小时')
return days * 8 + hours
}
/**
* 工时计算 方法2
* @param {Date} startTime 开始时间
* @param {Date} endTime 结束时间
* @returns 工时时长
*/
export function getWorkHoursV2(startTime, endTime) {
if (startTime.getTime() >= endTime.getTime()) return 0
//1 分钟取整
startTime = carryTime(startTime)
endTime = carryTime(endTime)
//2 有效的总小时数
var temp = 0
while (startTime.getTime() < endTime.getTime()) {
// 排除周六或者周日
if (startTime.getDay() == 6 || startTime.getDay() == 0) {
// 周六周日直接跳过,初始化为下一天早晨8点
startTime.setDate(startTime.getDate() + 1)
startTime.setHours(8)
startTime.setMinutes(0)
continue
}
// 计算每天有效工时
while (startTime.getHours() * 60 + startTime.getMinutes() != endTime.getHours() * 60 + endTime.getMinutes()) {
let tempMinutes = startTime.getHours() * 60 + startTime.getMinutes()
//上午8点到12点,算工时
if (tempMinutes >= (8 * 60) && tempMinutes < (12 * 60)) {
temp += 0.5
}
//上午13点到17点,算工时
if (tempMinutes >= (13 * 60) && tempMinutes < (17 * 60)) {
temp += 0.5
}
//每次增加半个小时
startTime.setTime(startTime.getTime() + 0.5 * 3600 * 1000)
}
// 下一天早晨8点
startTime.setDate(startTime.getDate() + 1)
startTime.setHours(8)
startTime.setMinutes(0)
}
// 有效总工时
return temp
}