计算请假时间,只包含工作时间,不包含中午午休和非工作时间及星期六星期天,结束时间不能小于开始时间

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;
     },

 

 

有问题欢迎询问! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql学习一

目录 1.启动数据库&#xff1a; 2.命令行连接到MySQL&#xff08;winr输入cmd&#xff09; 3.MySQL的三重结构&#xff1a; 4.SQL语句分类&#xff1a; 1.启动数据库&#xff1a; winr——输入services.msc进入本地服务 2.命令行连接到MySQL&#xff08;winr输入cmd&#x…

pyCharm导入pyspark中的sparkconf和sparkcontext错误

背景&#xff1a;学习黑马程序员python课程的pyspark实战部分时按照下图导入pysark包时发现sparkconf和sparkcontext无法导入和运行。 首先想到是不是在CMD窗口下载的pySpark路径及安装是否正确&#xff1f; 通过下图发现第三方库都安装正确&#xff0c;然后就考虑库的路径&a…

【Axure教程0基础入门】05动态面板

05动态面板 1.动态面板是什么&#xff1f; 一个用来存放多个元件的容器&#xff08;container&#xff09; 其中包含多个状态&#xff08;state&#xff09;&#xff0c;但同时只能显示一个 状态之间&#xff0c;可以通过交互动作&#xff08;action&#xff09;控制切换和动…

[激光原理与应用-88]:图解激光在工业加工领域的应用大全以及激光加工的优势

目录 前言&#xff1a; 激光加工分类 一、材料清除 1.1 激光清洗&#xff1a;去除污垢 1.2 激光雕刻&#xff1a;去除多余 1.3 激光划线 1.4 激光切割 1.5 激光打标 1.6 激光打孔 1.7 激光雕刻 二、材料增强 2.1 激光淬火&#xff1a;增加强度 2.2 激光退火&#…

企业常用Linux正则表达式与三剑客/企业生产环境及知识/企业中远程连接ssh工具(为什么连接有时慢?)

企业高薪思维: 1.学习去抓重点有价值知识 2.猛劲学&#xff0c;使劲学&#xff08;能否给别人将会&#xff0c;讲明白&#xff0c;写明白&#xff0c;练习明白&#xff09;&#xff0c;在学习过程中你觉得学会了60-80%&#xff0c;其实你只会了40-50%&#xff0c;你要讲明白会操…

阿里天池-淘宝用户购物行为数据可视化分析

目录 背景&#xff1a;数据说明&#xff1a;任务描述数据分析1. 流量分析2.漏斗分析 背景&#xff1a; 本次可视化分析的目的是针对脱敏过的用户行为数据&#xff08;包括浏览、收藏、加购和购买4类数据&#xff09;进行分析&#xff0c;使用Python、Numpy、Pandas和Matplotli…

面试十七、list和deque

一、 Deque Deque容器是连续的空间&#xff0c;至少逻辑上看来如此&#xff0c;连续现行空间总是令我们联想到array和vector,array无法成长&#xff0c;vector虽可成长&#xff0c;却只能向尾端成长&#xff0c;而且其成长其实是一个假象&#xff0c;事实上(1) 申请更大空间 (…

【C++】 二叉排序树BST(二叉搜索树)

目录 二叉搜索树的概念 二叉搜索树操作 基本框架 插入 二叉搜索树的删除(重点) 二叉搜索树的查找 拷贝构造 析构函数 operator 遍历 递归构造搜索二叉树 插入 删除 查找 二叉树的应用 二叉搜索树的性能分析 代码示例 BSTree.h Test.cpp 二叉搜索树的概念 二…

LMDeploy 量化部署 LLM-VLM 实践——作业

LMDeploy 量化部署 LLM-VLM 实践——作业 一、 基础作业1.1、配置 LMDeploy 运行环境1.2、以命令行方式与 InternLM2-Chat-1.8B 模型对话 二、进阶作业2.1、设置 KV Cache 最大占用比例为0.4&#xff0c;开启 W4A16 量化&#xff0c;以命令行方式与模型对话2.1.1、初始显存占用…

52 文本预处理【动手学深度学习v2】

将文本作为字符串加载到内存中。 将字符串拆分为词元&#xff08;如单词和字符&#xff09;。 建立一个词表&#xff0c;将拆分的词元映射到数字索引;将文本转换为数字索引序列&#xff0c;方便模型操作。

linux_python源码安装及基础设置odoo安装

python源码安装及基础设置 1、资源下载2、源码安装3、 yum安装pip4、pip安装虚拟环境1、安装虚拟环境库2、配置环境变量3、创建自己的虚拟环境 5、安装升级pip的两种方式1、get-pip.py升级2、安装源码升级 6、odoo部署 1、资源下载 python3.13 python版本库 2、源码安装 yum…

绿联 安装qbittorrent及一些常见错误的解决办法

绿联 安装qbittorrent及一些常见错误的解决办法 1、镜像 linuxserver/qbittorrent:latest 2、安装 2.1、创建容器 按需决定是否进行资源限制。 2.2、基础设置 2.3、网络 桥接即可。 注&#xff1a;如果使用IPV6&#xff0c;请选择"host"模式。 注&#xff1a;如…

Nodejs安装与配置--基于Linux系统--RedHat7.9

nodejs安装从未这么简单 1、nodejs版本设置&#xff1f; curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash - 其他版本如下&#xff1a; * https://rpm.nodesource.com/setup_16.x — Node.js 16 "Gallium" (deprecated) * https://rpm.nodesource.co…

基于python实现web漏洞挖掘技术的研究(django)

基于python实现web漏洞挖掘技术的研究(django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;网络爬虫&#xff0c;SQL注入&#xff0c;XSS漏洞工具&#xff1a;pycharm、Navicat、Maven 系统的实现与漏洞挖掘 系统的首页面 此次的系统首页面是登录的页…

(二)Servlet教程——我的第一个Java程序

首先打开记事本&#xff0c;输入如下的代码&#xff0c;请注意字母的大小写 public class MyFirst{ public static void main(String[] args){ System.out.println("This is My first Java..."); } } 将该txt文件命名为MyFirst.java 打开cmd命令行窗口&#xff0…

100吨微机控制电液伺服钢绞线拉伸试验机

一、简介 主机为四立柱、两丝杠、油缸下置式&#xff0c;拉伸空间位于主机的上方&#xff0c;压缩、弯曲试验空间位于主机下横梁和工作台之间。测控系统采用全数字多通道闭环测控系统&#xff0c;具有三闭环功能&#xff0c;即可以进行应力、应变、位移闭环等控制方式&#xf…

ThingsBoard通过规则链使用邮件发送报警信息

1、描述 2、通过规则链路配置发送邮件只需 两步 3、案例 1、基础链路 2、选择变换节点里面的To Email 3、 编辑节点to email 4、 将创建告警与to email链接 5、选择外部节点中的send email 6、配置邮箱相关信息&#xff0c;如过不知道密钥如何获取的&#xff0c;请查看下…

Java转go,我用了12小时,10小时在解决环境问题

Part1 问题背景 作为一个资深的Java开发者&#xff0c;我深知面向对象的高级语言&#xff0c;语法是不用学的。需要的时候搜索就可以了&#xff0c;甚至可以用ChatGPT来写。 之前我做一个安全多因素校验服务。因为是临时服务&#xff0c;扩展性上基本没有要求&#xff0c;为了快…

Opensbi初始化分析:设备初始化

Opensbi初始化分析&#xff1a;设备初始化 设备初始化sbi_init函数coldinit&#xff0c;冷启动初始化sbi_scratch_init函数sbi_domain_init函数sbi_hsm_initsbi_platform_early_initsbi_hart_initsbi_console_initsbi_platform_irqchip_init中断控制器的初始化sbi_ipi_init函数…

AutoPSA的埋地数据

用户在使用埋地算法时&#xff0c;问“不排水抗剪强度”什么意思&#xff1f; A:这个是土壤的参数&#xff0c;如果不填&#xff0c;软件会自动计算. 还有&#xff0c;垫片厚度&#xff0c;覆土压实乘子的数据没有从AutoPDMS导出时&#xff0c;需要手动输入一下。 其他&#…