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

news/2024/5/19 16:24:36

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 = 0let h1 = startTime.split(" ")[1].split(":")[0] * 1let h2 = endTime.split(" ")[1].split(":")[0] * 1// 分let m1 = startTime.split(" ")[1].split(":")[1] * 1let m2 = endTime.split(" ")[1].split(":")[1] * 1// 判断结束时间是否大于开始时间if (h2 >= h1) {// 判断上午还是下午还是跨了中午if (h1 < restEnd && h2 >= restStart) {// 跨了中午 是否在休息时间内if (h1 >= restStart) {h1 = restStartm1 = 0}if (h2 < restEnd) {h2 = restEndm2 = 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 = restStartm2 = 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;},

 

 

有问题欢迎询问! 


http://www.mrgr.cn/p/75455338

相关文章

设计一个算法删除单链表L(有头节点)中的一个最小值结点

数据结构 链表 笔试题:设计一个算法删除单链表L(有头节点)中的一个最小值结点。/***************************************************************** * * file name : linkedlist.c * author : cnzycwp@126.com * data : 2024/04/22 * function : 删除单链表中的一…

docker服务无法启动

背景&#xff1a;断电重启经常会导致磁盘io错误&#xff0c;甚至出现磁盘坏块 这时可以使用xfs_repair来修复磁盘&#xff0c;但是修复过程可能会导致部分数据丢失 xfs_repair -f -L /dev/sdc问题一&#xff1a; Apr 15 19:27:15 Centos7.6 systemd[1]: Unit docker.service e…

Visual Studio 2022 Professional、Enterprise安装教程

Visual Studio 2022 Professional、Enterprise安装教程 下载安装包安装 我是电脑已经有VS2019&#xff0c;现在加装一个VS2022。 下载安装包 首先下载安装包&#xff0c;进入官网进行下载&#xff0c;VS官网下载地址。 进入之后&#xff0c;会显示如下界面&#xff0c;选择Pro…

linux-rpm包管理-命名-管理

1.RPM基础概述 RPM全称 RPM Package Manager 缩写,由红帽开发用于软件包的安装,升级卸载与查询 为什么要学rpm就像在windows系统中一样,如果你想要安装一个 QQ ,安装一个 微信 ,安装一款 游戏 ,首先要去该软件的官网上去下载相关的软件包,通常都是 .exe 的安装包。还有那…

力扣110. 平衡二叉树

思路&#xff1a;与二叉树最大高度类似&#xff0c;但是这里需要返回 -1 的高度来标识不是平衡二叉树&#xff0c;判断左右子树的高度相差大于1则不平衡&#xff0c;否则就是平衡。 class Solution {public boolean isBalanced(TreeNode root) {int ans func(root);if(ans >…

最强开源大模型Meta LIama3抢先在线体验!

4月19日Facebook母公司Meta重磅推出了其迄今最强大的开源人工智能&#xff08;AI&#xff09;模型——Llama 3。模型分为两种规模&#xff1a;8B 和 70B 参数&#xff0c;每种规模都提供预训练基础版和指令调优版。最强开源大语言模型Meta LIama3可以在线体验啦&#xff01; G…

【运输层】TCP 的流量控制和拥塞控制

目录 1、流量控制 2、TCP 的拥塞控制 &#xff08;1&#xff09;拥塞控制的原理 &#xff08;2&#xff09;拥塞控制的具体方法 1、流量控制 一般说来&#xff0c;我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快&#xff0c;接收方就可能来不及接收&#x…

TensorFlow文件读取 --TFRecords文件

TFRecords文件 是一种二进制文件&#xff0c;能够很好的利用内存&#xff0c;更方便复制和移动&#xff0c;并且不需要单独的标签文件 使用步骤 1&#xff09;获取数据 2&#xff09;将数据填入到Example协议内存块&#xff08;protocol buffer&#xff09; 3&#xff09;将协…

vis.js本地化折线图

代码案例<!doctype html> <html> <head><title>Timeline</title><script type="text/javascript" src="https://unpkg.com/vis-timeline@latest/standalone/umd/vis-timeline-graph2d.min.js"></script><lin…

【每周例题】力扣 C++ 分割字符串

分割字符串 题目 题目分析 1.先确定用容器存储,容器的存储结构如下图所示: 2.这个题目的话,第一反应应该是用到动态规划,下面是动态规划的模板:res = [] ans = []def backtrack(未探索区域, res, path):if 未探索区域满足结束条件:res.add(ans) # 深度拷贝returnfor 选择 …

Midjourney 实现角色一致性的新方法

AI 绘画的奇妙之处&#xff0c;实乃令人叹为观止&#xff01;就像大千世界中&#xff0c;寻不见两片完全相同的树叶一般&#xff0c;AI 绘画亦复如是。同一提示之词&#xff0c;竟能催生出千变万化的图像&#xff0c;使得AI所绘之作&#xff0c;宛如自然之物般独特&#xff0c;…

内网信息收集命令汇总

查看网络配置信息 ipconfig/all查看操作系统及软件信息查看操作系统和版本信息 systeminfo | findstr /B /C:"OS"查看系统体系结构 echo %PROCESSOR_ARCHITECTURE%查看安装的软件及版本、路径等 wmic product get name, versionpowershell "Get-WmiObject -clas…

上位机图像处理和嵌入式模块部署(智能硬件的介绍)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前&#xff0c;用上位机软件虽然可以部署项目&#xff0c;但是它本身有自己的缺点&#xff0c;那就是稳定性差、价格贵。稳定性这部分&#xff0…

操作系统——进程

进程定义 是计算机中已经运行的程序是系统进行资源分配和调度的一个独立单位。 进程的特性 独立性&#xff1a;进程在内存中可以独立寻址&#xff0c;每个进程都有一个独立的堆栈空间。动态性&#xff1a;进程在执行过程中可以申请资源、使用资源、释放资源。并发性&#xf…

Nacos配置管理-微服务配置拉取

创造来源&#xff1a;在学习微服务这部分内容的时候遇到很多bug&#xff0c;改了又改&#xff0c;最后改好了。以下是我修改后实现配置拉取的代码&#xff0c;这里我使用了鉴权&#xff0c;所以配置里面有使用到下面的代码&#xff0c;如果没有配置鉴权则删掉下面代码。新版本的…

v-pre, v-once, v-cloak

v-pre,是将元素内的内容全部渲染出来 最常见的就是显示双大括号标签及内容 上面的代码输出为: 直接将元素的内的内容直接渲染出来 v-once是用来将元素的值只进行一次变化,仅渲染元素和组件一次,并跳过之后的更新 上述代码中,当经过了两秒输出为: <div v-once>这个元…

智慧水务能效管理系统平台/地下污水厂配电系统电气安全设计

安科瑞电气薛瑶瑶18701709087 1、引言 地下水污厂在城市建设中扮演着重要的角色,负责对城市污水和废物进行处理和排放。然而,由于地下水污厂中存在着许多危险因素,如有害气体、液体和固体废物等,因此要保证电气安全。电气安全系统是地下水污厂安全生产的重要保障措施之一,包括…

删除顺序表L中下标为p(0≤ p ≤length-1)的元素,成功返回1,否则返回0,并将待删除的元素的值赋给e。

/******************************************************** name : DelElement* function : (笔试题)删除顺序表L中下标为p(0<≤ p ≤length-1)的元素,* 成功返回1,否则返回0,并将待删除的元素的值赋给e。* argument* @p :需要…