function getDuration(starTime, endTime) {//計算時長
let num1 = 0,num2 = 0;
num1 = parseInt(starTime.split(":")[0]) +parseInt(starTime.split(":")[1]) / 60;
num2 = parseInt(endTime.split(":")[0]) + parseInt(endTime.split(":")[1]) / 60;
return num2-num1
};
function DateDiff(sDate1, sDate2){//計算2018-03-23 至 2018-04-01之間的時間差,開始天數不計算在內
var aDate, oDate1, oDate2, iDays
aDate = sDate1.split("-")
oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
aDate = sDate2.split("-")
oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 /24)
return iDays
}
function calculateTimeOff(st,et) {//計算不是整天部分的請假時長
let m={key:null, duration:null},n={key:null, duration:null},o=null;
workTime.forEach((v,k)=>{
if(v[0]<= st && v[1] >= st){//開始時間在上班時間段內
m.key = k
m.duration = getDuration(st,v[1])
}
if(workTime[k+1]){//有下一個上班時間段
if(v[0]<et && v[1]>=et){//在上班時段內
n.key = k
n.duration = v[1] == et ? getDuration(v[0],v[1]) : getDuration(v[0],et)
}else if(et>v[1] && et < workTime[k+1][0]){//不在上班時段內
n.key = k
n.duration = getDuration(v[0],v[1])
}
}else{//沒有下一個上班時間段
if(v[0]<et && v[1]>=et){//在上班時段內
n.key = k
n.duration = v[1] == et ? getDuration(v[0],v[1]) : getDuration(v[0],et)
}else if(v[0]<et && et > v[1]){//不在上班時段內
n.key = k
n.duration = getDuration(v[0],v[1])
}
}
});
if(n.key - m.key > 1){
workTime.forEach((v,k)=>{
if(m.key<k<n.key){
o = o + getDuration(v[1],v[0]);
}
});
return (o + m.duration + n.duration)/workHours;
}else if(n.key == m.key){
if(et>workTime[m.key][1]){
return (getDuration(st,workTime[m.key][1])/workHours);
}else{
return (getDuration(st,et)/workHours);
}
}else{
return (m.duration + n.duration)/workHours;
}
}
let workTime=["09:00","18:00"];
let workHours = 8;
let startTime = "2018-3-27 09:00".split(" ")[1];
let endTime = "2018-3-29 18:00".split(" ")[1];
let dayNum = DateDiff("2018-3-27 09:00".split(" ")[0],"2018-3-27 09:00".split(" ")[0])
if(dayNum == 0){
val.days = calculateTimeOff(startTime,endTime)
}else{
if(val.dateType==2){//請假時長計算 自然日
val.days = dayNum + calculateTimeOff(startTime, workTime[workTime.length-1][1]) + calculateTimeOff(workTime[0][0],endTime)-1
}else{//請假時長只計算工作日
let noUseDay = 0// 請假時段內有幾天是休息日
let unixDb = new Date(val.startDate.split(" ")[0]).getTime()// 開始時間
let unixDe = new Date(val.endDate.split(" ")[0]).getTime()// 結束時間
for (let k = unixDb; k <= unixDe;) {//循環遍歷 判斷時間段內有幾個周末
if (val.workDay.indexOf(new Date(k).getDay()) == -1) {
noUseDay = ++noUseDay
}
k = k + 24 * 60 * 60 * 1000
}
val.days = dayNum - noUseDay + calculateTimeOff(startTime, workTime[workTime.length-1][1]) + calculateTimeOff(workTime[0][0],endTime)-1
}
}