計算兩個日期之前的工作日時長(小時)
阿新 • • 發佈:2019-02-13
//計算請假時長,驗證時間格式 function calctimelong(obj, guid) { var previous = parseFloat($('#TimeLong' + guid).val()); $('#TimeLong' + guid).val('0'); var leavestartdate = $('#LeaveStartDate' + guid).val().trim(); var leaveenddate = $('#LeaveEndDate' + guid).val().trim(); var leavestarttime = $('#LeaveStartTime' + guid).val().trim(); var leaveendtime = $('#LeaveEndTime' + guid).val().trim(); if (leavestartdate == '' || leaveenddate == '' || leavestarttime == '' || leaveendtime == '') return; if (!testTimeFormatter(leavestarttime) || !testTimeFormatter(leaveendtime)) { $('#LeaveStartTime' + guid).val('00:00'); $('#LeaveEndTime' + guid).val('00:00'); $('#TimeLong' + guid).val('0'); $.messager.alert("提示", "時間格式不正確", "Info", function () { }); return; } if (leavestarttime == '00:00') leavestarttime = "08:30"; if (leaveendtime == '00:00') leaveendtime = "18:00"; var dt1 = Date.parse(new Date((leavestartdate + " " + leavestarttime).replace(/-/g, "/"))); var dt2 = Date.parse(new Date((leaveenddate + " " + leaveendtime).replace(/-/g, "/"))); if (dt1.toString() == 'NaN' || dt2.toString() == 'NaN') { $('#LeaveStartTime' + guid).val('00:00'); $('#LeaveEndTime' + guid).val('00:00'); $('#TimeLong' + guid).val('0'); $.messager.alert("提示", "時間格式不正確", "Info", function () { }); return; } if (dt1 > dt2) { $('#LeaveEndDate' + guid).val(''); $('#LeaveEndTime' + guid).val('00:00'); $('#TimeLong' + guid).val('0'); $.messager.alert("提示", "請假開始時間不能大於結束時間", "Info"); return; } var s1 = Date.parse(new Date((leavestartdate + " 08:30:00").replace(/-/g, "/"))); var s2 = Date.parse(new Date((leavestartdate + " 12:00:00").replace(/-/g, "/"))); var s3 = Date.parse(new Date((leavestartdate + " 13:30:00").replace(/-/g, "/"))); var s4 = Date.parse(new Date((leavestartdate + " 18:00:00").replace(/-/g, "/"))); var e1 = Date.parse(new Date((leaveenddate + " 08:30:00").replace(/-/g, "/"))); var e2 = Date.parse(new Date((leaveenddate + " 12:00:00").replace(/-/g, "/"))); var e3 = Date.parse(new Date((leaveenddate + " 13:30:00").replace(/-/g, "/"))); var e4 = Date.parse(new Date((leaveenddate + " 18:00:00").replace(/-/g, "/"))); var workdays = '@strworkday'.split(','); var difdt = 0;//請假時長 var fdifdt = 0; //第一天時長 var mdifdt = 0; //中間日期時長 var edifdt = 0; //最後一天時長 /*******************************計算請假時長(根據工作日表)*********************************/ if (leavestartdate == leaveenddate) { if (workdays.indexOf(leavestartdate) >= 0) {//工作日 if (dt1 < s1) dt1 = s1; else if (dt1 >= s2 && dt1 < s3) dt1 = s3; else if (dt1 > s4) dt1 = s4; if (dt2 < e1) dt2 = e1; else if (dt2 >= e2 && dt2 < e3) dt2 = e2; else if (dt2 > e4) dt2 = e4; fdifdt = dt2 - dt1;//時差毫秒 if (dt1 <= s2 && dt2 >= e3) fdifdt = fdifdt - 1.5 * 60 * 60 * 1000; } } else if (datediff(leavestartdate, leaveenddate) == 1) { if (workdays.indexOf(leavestartdate) >= 0) {//第一天工作日 if (dt1 < s1) dt1 = s1; else if (dt1 >= s2 && dt1 < s3) dt1 = s3; else if (dt1 > s4) dt1 = s4; fdifdt = s4 - dt1;//時差毫秒 if (dt1 <= s2) fdifdt = fdifdt - 1.5 * 60 * 60 * 1000; } if (workdays.indexOf(leaveenddate) >= 0) {//最後一天工作日 if (dt2 < e1) dt2 = e1; else if (dt2 >= e2 && dt2 < e3) dt2 = e2; else if (dt2 > e4) dt2 = e4; edifdt = dt2 - e1;//時差毫秒 if (dt2 >= e3) edifdt = edifdt - 1.5 * 60 * 60 * 1000; } } else if (datediff(leavestartdate, leaveenddate) > 1) { if (workdays.indexOf(leavestartdate) >= 0) {//第一天工作日 if (dt1 < s1) dt1 = s1; else if (dt1 >= s2 && dt1 < s3) dt1 = s3; else if (dt1 > s4) dt1 = s4; fdifdt = s4 - dt1;//時差毫秒 if (dt1 <= s2) fdifdt = fdifdt - 1.5 * 60 * 60 * 1000; } if (workdays.indexOf(leaveenddate) >= 0) {//最後一天工作日 if (dt2 < e1) dt2 = e1; else if (dt2 >= e2 && dt2 < e3) dt2 = e2; else if (dt2 > e4) dt2 = e4; edifdt = dt2 - e1;//時差毫秒 if (dt2 >= e3) edifdt = edifdt - 1.5 * 60 * 60 * 1000; } var tmpdate = leavestartdate; for (var i = 0; i < datediff(leavestartdate, leaveenddate) - 1 ; i++) { tmpdate = new Date(new Date(tmpdate).getTime() + 24 * 60 * 60 * 1000); var year = tmpdate.getFullYear(); var month = tmpdate.getMonth() + 1; var date = tmpdate.getDate(); tmpdate = year + '-' + month + '-' + date; if (workdays.indexOf(tmpdate) >= 0) { mdifdt = mdifdt + 8; } } mdifdt = mdifdt * 60 * 60 * 1000; } /**************************************************************************/ difdt = fdifdt + mdifdt + edifdt;//請假時長 //計算時間差的毫秒數 var hours = (difdt / (3600 * 1000)).toFixed(2); if (hours < 0) hours = 0.00; $('#TimeLong' + guid).val(hours); if (previous != hours) { //清空選擇的時期和工時 showstr = "<span>選擇調休使用工時日期</span>"; $('#sdate' + guid).val(''); $('#edate' + guid).val(''); $('#TimeAtDays' + guid).empty(); $('#TimeAtDays' + guid).append(showstr); $('#chooselongtotal' + guid).val(0); $('#TimeAtDaysHidden' + guid).val(''); } } //當請假事由發生變化時 function onreasonchange(obj, guid) { if ($(obj).val() == '調休') { $('#TimeAtDays' + guid).css('display', 'block'); } else { $('#TimeAtDays' + guid).css('display', 'none'); } } //計算日期相差天數 function datediff(d1, d2) { var day = 24 * 60 * 60 * 1000; try { var dateArr = d1.split("-"); var checkDate = new Date(); checkDate.setFullYear(dateArr[0], dateArr[1] - 1, dateArr[2]); var checkTime = checkDate.getTime(); var dateArr2 = d2.split("-"); var checkDate2 = new Date(); checkDate2.setFullYear(dateArr2[0], dateArr2[1] - 1, dateArr2[2]); var checkTime2 = checkDate2.getTime(); var cha = (checkTime2 - checkTime) / day; return cha; } catch (e) { return false; } }