欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

休假时间的计算只包括工作时间,不包括午休时间、非工作时间、周六和周日,且结束时间不得少于开始时间。

最编程 2024-04-23 07:18:48
...

1.计算相差小时,没有休息时间 

computed: {
    // 计算相差小时
    time() {
      let time = 0;
      if (
        this.ruleForm.date1 &&
        this.ruleForm.date2 &&
        this.ruleForm.date3 &&
        this.ruleForm.date4
      ) {
        // 开始时间
        let date1 = this.ruleForm.date1;
        let y = date1.getFullYear();
        let m = date1.getMonth() + 1;
        m = m < 10 ? "0" + m : m;
        let d = date1.getDate();
        d = d < 10 ? "0" + d : d;
        let dateTime1 =
          y + "-" + m + "-" + d + " " + this.ruleForm.date2 + ":" + "00";
        // 结束时间
        let date3 = this.ruleForm.date3;
        let y2 = date3.getFullYear();
        let m2 = date3.getMonth() + 1;
        m2 = m2 < 10 ? "0" + m2 : m2;
        let d2 = date3.getDate();
        d2 = d2 < 10 ? "0" + d2 : d2;
        let dateTime2 =
          y2 + "-" + m2 + "-" + d2 + " " + this.ruleForm.date4 + ":" + "00";
        // 开始时间
        this.start = dateTime1;
        // 结束时间
        this.finish = dateTime2;
        var time1 = new Date(dateTime1);
        var time2 = new Date(dateTime2);
        let dateDiff = time2.getTime() - time1.getTime();
        // 计算出小时数
        let hours = dateDiff / (3600 * 1000);
        //
        time = hours.toFixed(1).replace(/\.0$/, "");
        if (time <= 0) {
          // "结束时间必须大于开始时间"
          this.tips = true;
          time = 0;
        } else {
          this.tips = false;
        }
      }
      return time + " 小时";
    },
}

2.计算工作时间,不含非工作时间及星期六星期天

   computed: {
    // 计算请假时间不包含中午12点到13点30的休息时间及9点到18点外的非工作时间
    time() {
      let time = 0;
      if (
        this.ruleForm.date1 &&
        this.ruleForm.date2 &&
        this.ruleForm.date3 &&
        this.ruleForm.date4
      ) {
        // 开始时间
        let date1 = this.ruleForm.date1;
        let y = date1.getFullYear();
        let m = date1.getMonth() + 1;
        m = m < 10 ? "0" + m : m;
        let d = date1.getDate();
        d = d < 10 ? "0" + d : d;
        let dateTime1 =
          y + "-" + m + "-" + d + " " + this.ruleForm.date2 + ":" + "00";
        // 结束时间
        let date3 = this.ruleForm.date3;
        let y2 = date3.getFullYear();
        let m2 = date3.getMonth() + 1;
        m2 = m2 < 10 ? "0" + m2 : m2;
        let d2 = date3.getDate();
        d2 = d2 < 10 ? "0" + d2 : d2;
        let dateTime2 =
          y2 + "-" + m2 + "-" + d2 + " " + this.ruleForm.date4 + ":" + "00";
        // 开始时间
        this.start = dateTime1;
        // 结束时间
        this.finish = dateTime2;
        // 计算小时数
        time = this.calculateLeaveTime(dateTime1, dateTime2)
      }
      return time;
    },
  },

封装方法:传入 (年-月-日 时:分) 格式

 // 计算工作时间调休小时数
    calculateLeaveTime(startTime, endTime) {
      // console.log(startTime);
      // console.log(endTime);
      // 工作开始结束时间
      const workStart = 9;
      const workEnd = 18;
      // 休息开始结束时间
      const restStart = 12;
      const restEnd = 13;
      // 请假天数
      let day = 0;
      // 总计小时数
      let total_hour = 0;
      // 循环每天
      for (let date = new Date(startTime); date <= new Date(endTime); date.setDate(date.getDate() + 1)) {
        day++
        // 每天多少小时
        let dayLeaveTime = 0;
        // 获取今天是星期几
        let x = date.getDay();
        // 除开中午休息时间和星期六星期天
        if (![0, 6].includes(x)) {
          // 第一天要获取开始时间和结束时间
          if (day == 1) {
            // 小时
            let h = 0
            let h1 = startTime.split(" ")[1].split(":")[0] * 1
            let h2 = endTime.split(" ")[1].split(":")[0] * 1
            // 分
            let m1 = startTime.split(" ")[1].split(":")[1] * 1
            let m2 = endTime.split(" ")[1].split(":")[1] * 1
            // 判断结束时间是否大于开始时间
            if (h2 >= h1) {
              // 判断上午还是下午还是跨了中午
              if (h1 < restEnd && h2 >= restStart) {
                // 跨了中午 是否在休息时间内
                if (h1 >= restStart) {
                  h1 = restStart
                  m1 = 0
                }
                if (h2 < restEnd) {
                  h2 = restEnd
                  m2 = 0
                }
                console.log("跨了中午", restStart - h1 + h2 - restEnd);
                h = restStart - h1 + h2 - restEnd
              } else if (h1 <= restStart && h2 <= restStart) {
                // 上午
                console.log("上午", h2 - h1);
                h = h2 - h1
              } else if (h1 >= restEnd && h2 >= restEnd) {
                // 下午
                console.log("下午", h2 - h1);
                h = h2 - h1
              }
            } else {
              // 判断上午还是下午还是跨了中午
              if (h1 >= restEnd && h2 < restEnd) {
                // 跨了中午
                if (h2 >= restStart) {
                  h2 = restStart
                  m2 = 0
                }
                console.log("跨了中午", workEnd - h1 + h2 - workStart);
                h = workEnd - h1 + h2 - workStart
              } else if (h1 <= restStart && h2 <= restStart) {
                // 上午
                console.log("上午", workEnd - h1 + h2 - workStart);
                h = workEnd - h1 + h2 - workStart - (restEnd - restStart)
              } else if (h1 >= restEnd && h2 >= restEnd) {
                // 下午
                console.log("下午", restStart - workStart + (workEnd - h1) + (h2 - restEnd));
                h = restStart - workStart + (workEnd - h1) + (h2 - restEnd)
              }
            }
            // 计算分钟
            console.log("第一天的小时", h);
            console.log("第一天的分钟", (m2 - m1) / 60);
            dayLeaveTime = h + ((m2 - m1) / 60)
            if (h < 0 || (h <= 0 && ((m2 - m1) / 60) <= 0)) {
              // "结束时间必须大于开始时间"
              this.tips = true;
              dayLeaveTime = 0;
            } else {
              this.tips = false;
            }
          } else {
            // 第二天开始 循环每天的工作时间范围的小时数
            for (let hour = workStart; hour < workEnd; hour++) {
              if (hour <= restStart || hour > restEnd) {
                dayLeaveTime += 1
              }
            }
          }
        }
        console.log(date.getDate() + "号的小时数", dayLeaveTime);
        total_hour += dayLeaveTime
      }
      if (day == 0) {
        // "结束时间必须大于开始时间"
        this.tips = true;
      } else {
        this.tips = false;
      }
      console.log(day + "天");
      console.log(total_hour + "小时");
      return total_hour + "小时";
    },

 

时间间隔30分钟 

3.设置结束时间不能小于开始时间

注意: :picker-options 属性失效,使用 :disabled-date 

<el-date-picker type="date" placeholder="结束日期" :disabled-date="disabledDate" v-model="ruleForm.date3" style="width: 100%"></el-date-picker>
    // 结束时间不能小于开始时间
    disabledDate(time){
         return time.getTime() < this.ruleForm.date1;
     },

 

 

有问题欢迎询问!