前端计算加班时间/请假时间等一系列 结束时间 减去 初始时间 计算时差的一些相关问题

文章讲述了在Vue.js项目中开发考勤模块时遇到的时间计算问题,包括获取时间戳、转换时间格式、计算工时以及处理特定工时规则(如0.5小时取整策略)。通过日期选择器的change事件进行时间差计算,并根据业务规则调整计算结果。
摘要由CSDN通过智能技术生成

最近项目需求做的考勤模块,时间计算这一块用的比较频繁,难免也遇到了一些问题,记录一下碰到的壁和解决办法

管理系统中,考勤模块避免不了要做加班、出差、请假之类的时间计算,如下图,选择完初始时间和结束时间之后需要做一个自动计算工时的功能

 

思路:先获取到两个时间戳,分别转换成 XX天XX小时XX分钟XX秒 的形式,然后根据项目需求的不同计时单位进行不同处理

比如举例的这个例子是以小时为单位的,我需要获取到两个时间戳然后进行转换

<el-col :span="24">
  <el-form-item label="加班时间:" prop="start_date">
    <el-date-picker
      v-model="date"
      type="datetimerange"
      range-separator="至"
      start-placeholder="开始日期-时间"
      end-placeholder="结束日期-时间"
      @change="setime"
    >
    </el-date-picker>
  </el-form-item>
</el-col>

时间选择器处代码,需要在change回调处进行计算的处理,下面是处理时间的方法


      let date3 = this.date[1].getTime() - this.date[0].getTime()
      //计算出相差天数
      let days = Math.floor(date3 / (24 * 3600 * 1000))
      //计算出小时数
      let leave1 = date3 % (24 * 3600 * 1000) //计算天数后剩余的毫秒数
      let hours = Math.floor(leave1 / (3600 * 1000))
      //计算相差分钟数
      let leave2 = leave1 % (3600 * 1000) //计算小时数后剩余的毫秒数
      let minutes = Math.floor(leave2 / (60 * 1000))
      //计算相差秒数
      let leave3 = leave2 % (60 * 1000) //计算分钟数后剩余的毫秒数
      let seconds = Math.round(leave3 / 1000)
      let matrixingMin =
        Number(days) * 24 * 60 + Number(hours) * 60 + Number(minutes)
      let matrixingHours = matrixingMin / 60

注释:date是存放开始时间和结束时间的数组,在data里面存放着 

data() {
    return {
      // 加班时间
      date: [],
    }
  },

处理完时间后,要在对数据保存之前进行一些判断,比如我们这个项目组规定的要求是,加班超过0.5个小时但是不满1个小时的情况,就按0.5个小时算,下面就是进行的判断处理

const fractionDigits = 1 // 保留1位小数
let result = +`${matrixingHours}e${fractionDigits}` 
result <<= 0 
result = +`${result}e${-fractionDigits}`
// 判断计算出来的工时最后一位是否等于5
if (String(result).substr(-1) < 5) {
  const fractionDigits = 0 // 保留0位小数
  let result = +`${matrixingHours}e${fractionDigits}` 
  result <<= 0 // 145
  result = +`${result}e${-fractionDigits}` 
  this.form.work_hours = result
} else {
  const fractionDigits = 0 // 保留0位小数
  let result = +`${matrixingHours}e${fractionDigits}`
  result <<= 0 // 145
  result = +`${result}e${-fractionDigits}`
  this.form.work_hours = result + '.5'
 // 如果得到的小数点后的一位大于五,先把字符串接去掉,手动加上".5"
}

以下是change回调的完整代码

    setime() {
      // console.log(this.date)
      this.form.start_date = this.formatDate(this.date[0])

      this.form.end_date = this.formatDate(this.date[1])
      let date3 = this.date[1].getTime() - this.date[0].getTime()
      //计算出相差天数
      let days = Math.floor(date3 / (24 * 3600 * 1000))
      //计算出小时数
      let leave1 = date3 % (24 * 3600 * 1000) //计算天数后剩余的毫秒数
      let hours = Math.floor(leave1 / (3600 * 1000))
      //计算相差分钟数
      let leave2 = leave1 % (3600 * 1000) //计算小时数后剩余的毫秒数
      let minutes = Math.floor(leave2 / (60 * 1000))
      //计算相差秒数
      let leave3 = leave2 % (60 * 1000) //计算分钟数后剩余的毫秒数
      let seconds = Math.round(leave3 / 1000)
      let matrixingMin =
        Number(days) * 24 * 60 + Number(hours) * 60 + Number(minutes)
      let matrixingHours = matrixingMin / 60

      const fractionDigits = 1 // 保留1位小数
      let result = +`${matrixingHours}e${fractionDigits}` // 145.78
      result <<= 0 // 145
      result = +`${result}e${-fractionDigits}` // 1.45
      // 判断计算出来的工时最后一位是否等于5
      if (String(result).substr(-1) < 5) {
        const fractionDigits = 0 // 保留0位小数
        let result = +`${matrixingHours}e${fractionDigits}` // 145.78
        result <<= 0 // 145
        result = +`${result}e${-fractionDigits}` // 1.45
        this.form.work_hours = result
      } else {
        const fractionDigits = 0 // 保留0位小数
        let result = +`${matrixingHours}e${fractionDigits}` // 145.78
        result <<= 0 // 145
        result = +`${result}e${-fractionDigits}` // 1.45
        this.form.work_hours = result + '.5'
      }
    },

这其中formatDate()方法是将标准时间转换为yyyy-mm-dd HH:mm:ss格式的方法

    // 将标准时间转换为yyyy-mm-dd HH:mm:ss格式
    formatDate(time) {
      const date = new Date(parseInt(time.valueOf()))
      const year = date.getFullYear()
      const month =
        date.getMonth() + 1 > 9
          ? date.getMonth() + 1
          : `0${date.getMonth() + 1}`
      const day = date.getDate() > 9 ? date.getDate() : `0${date.getDate()}`
      const hour = date.getHours() > 9 ? date.getHours() : `0${date.getHours()}`
      const minutes =
        date.getMinutes() > 9 ? date.getMinutes() : `0${date.getMinutes()}`
      const seconds =
        date.getSeconds() > 9 ? date.getSeconds() : `0${date.getSeconds()}`
      return `${year}-${month}-${day} ${hour}:${minutes}:${seconds}`
    },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九龙长廊_富贵呱呱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值