1. 程式人生 > >計算兩個日期之前的工作日時長(小時)

計算兩個日期之前的工作日時長(小時)

    //計算請假時長,驗證時間格式
    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;
        }
    }