根据当年节假日和非工作时间计算请假时间-获取每个月的节假日,计算每个月的工作日时间进度,节假日每年更新

news2025/3/12 23:42:53

根据需求请假时间要排除法定节假日和非工作时间

1.获取当年的节假日

节假日是每年更新的,没有固定接口,需要手动录入

个人根据官方的节假日整理了当年的所有节假日,可以根据个人需求进行修改

// 获取每个月的节假日,如果当月没有节假日就默认星期六星期天
holidays: [
      [],// 1月
      [3, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25],// 2月
      [],// 3月
      [4, 5, 6, 13, 14, 20, 21, 27],// 4月
      [1, 2, 3, 4, 5, 12, 18, 19, 25, 26],// 5月
      [1, 2, 8, 9, 10, 15, 16, 22, 23, 29, 30],// 6月
      [],// 7月
      [],// 8月
      [7, 8, 15, 16, 17, 21, 22, 28],// 9月
      [1, 2, 3, 4, 5, 6, 7, 13, 19, 20, 26, 27],// 10月
      [],// 11月
      [],// 12月
    ]

2.使用当年的节假日进行判断

这里是封装的计算方法,传入开始时间和结束时间 时间格式为:年-月-日 时:分

里面定义了上班开始结束时间和中午休息时间,可以自定义

// 计算工作时间调休小时数
    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 m = date.getMonth()
        // 获取当月是否有节假日 我存储到vuex里面的,通过下标获取当月的节假日
        let holiday_arr = this.$store.state.holidays[m]
        console.log(holiday_arr);
        // 获取今天是星期几
        let x = date.getDay();
        // 今天是几号
        let i = date.getDate();
        // console.log(i + "号");
        // console.log("星期" + x);
        // 有时候要补节假日获取手动录入的节假日进行计算
        if (holiday_arr.length != 0 && holiday_arr.includes(i)) {
          // console.log(i + "号");
          continue;
        }
        // 除开中午休息时间和星期六星期天
        if ([0, 6].includes(x) && holiday_arr.length == 0) {
          // console.log("星期" + x);
          continue;
        }
        // 上面判断是否计算当前
        // 第一天要获取开始时间和结束时间
        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
      }
      // console.log(day + "天");
      // console.log(total_hour + "小时");
      return total_hour + "小时";
    },

 

这里按每天八小时计算,排除了2024年法定节假日 劳动节的调休 一共使用了工作时间的32小时

3.计算当月工作日时间进度

// 计算工作日时间进度
            // 获取当前时间
            const now = new Date();
            // 获取当前年份和月份
            const currentYear = now.getFullYear();
            const currentMonth = now.getMonth();
            // 获取vuex里面存储的节假日
            let holidays = this.$store.state.holidays[currentMonth]
            // console.log("当月节假日", holidays);
            // 计算当月天数
            const daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate();
            // 当月几号
            const dayOfMonth = now.getDate();
            //  console.log("当月天数:", daysInMonth);
            //  console.log("当月的第", dayOfMonth, "天");
            // 工作日天数
            let workday = 0;
            // 当前工作日天数
            let Month = 0;
            // 当前时间进度
            let num = "0%";
            // 判断是否设置节假日
            if (holidays.length) {
                // 自定义节假日
                workday = daysInMonth - holidays.length;
                // console.log("自定义工作日", workday);
                // 默认已工作日
                for (let i = 1; i < dayOfMonth + 1; i++) {
                    if (!holidays.includes(i)) {
                        Month++;
                    }
                }
                num = Month / workday;
            } else {
                // 循环默认天数
                for (let i = 1; i < daysInMonth + 1; i++) {
                    let date = new Date(
                        new Date().getFullYear(),
                        new Date().getMonth(),
                        i
                    );
                    // 遍历每天获取星期几
                    let x = date.getDay();
                    // 不是节假日工作日就加一
                    if (![0, 6].includes(x)) {
                        workday++;
                    }
                }
                //  console.log("默认工作日", workday);
                // 默认已工作日
                for (let i = 1; i < dayOfMonth + 1; i++) {
                    let date = new Date(
                        new Date().getFullYear(),
                        new Date().getMonth(),
                        i
                    );
                    // 遍历每天获取星期几
                    let x = date.getDay();
                    // 不是节假日工作日就加一
                    if (![0, 6].includes(x)) {
                        Month++;
                    }
                }
                num = Month / workday;
            }
            // console.log("已工作", Month, "天");
            // console.log("时间进度" + (num * 100).toFixed(1) + "%");
            // 赋值时间进度
            this.less_day = (num * 100).toFixed(1).replace(/\.0$/, "") + "%";

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Qt 学习笔记】Qt常用控件 | 显示类控件 | LCD Number的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件 | LCD Number的使用及说明 文章编号&#xf…

ELK技术介绍:背景、功能及应用场景全面解析

一、ELK概述 ELK是由Elasticsearch、Logstash和Kibana三个开源软件组成的日志管理解决方案&#xff0c;这一组合在近年来得到了广泛的关注和应用。ELK的出现&#xff0c;源于大数据和云计算技术的快速发展&#xff0c;以及对高效日志管理的迫切需求。 随着企业信息化程度…

3dmax云渲染100插件怎么安装?渲染100邀请码1a12

3dmax云渲染插件能在设计师完成参数设置后&#xff0c; 通过点击插件的方式上传到云渲染平台进行渲染&#xff0c;那么3dmax云渲染插件怎么安装呢&#xff1f;以渲染100为例&#xff0c;我们来看下。 下载工具&#xff1a;渲染100客户端 1、设计师在渲染100官网(http://www.x…

淘宝扭蛋机小程序开发:开启购物新纪元,探索乐趣无穷的互动体验

随着科技的飞速发展&#xff0c;人们的购物方式也在不断革新。淘宝扭蛋机小程序应运而生&#xff0c;它巧妙地结合了线上购物与线下娱乐&#xff0c;为消费者带来了一种前所未有的互动体验。今天&#xff0c;就让我们一起走进淘宝扭蛋机小程序的开发世界&#xff0c;探索其背后…

DHCP原理和配置

1、DHCP原理 &#xff08;1&#xff09;什么是DHCP DHCP(Dynamic HostConfiguration Protocol,动态主机配置协议)&#xff1a;给网络内的客户机自动分配IP地址由internet工作任务小组设计开发口专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议DHCP采用的是UDP作为传输…

【数字图像处理笔记】Matlab实现离散傅立叶变换 (二)

&#x1f48c; 所属专栏&#xff1a;【数字图像处理笔记】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x…

离线语音模块初步学习——LSYT201B(深圳雷龙发展)

一 、产品简介 首先简单介绍下该离线语音模块&#xff0c;官方给出的介绍是&#xff1a;YT2228 是根据智能语音交互市场需求及思必驰算法的发展方向定义开发的 “芯片算法”人工智能人机语音交互解决方案&#xff0c;具有高性能、低功耗等特点。该芯片通过软硬融合的方法&…

流量代理第一弹:入门使用

定义 “流量代理是一种网络通信技术&#xff0c;它充当网络通信的中间人&#xff0c;将流量从一个地方传递到另一个地方。通常用于实现网络隧道、网络加速、访问控制和隐私保护等功能。“ 上面是来自chatGPT的回答。从这个回答中&#xff0c;我们不难看出&#xff0c;流量代理…

专利视角下的量子竞赛:《2024全球专利格局白皮书》

2024年1月&#xff0c;欧洲量子产业联盟&#xff08;QuIC&#xff09;发布了题为《全球量子技术专利格局描述》的综合白皮书。 该文件以透明的视角展示了当今的知识产权格局&#xff0c;包括知识产权持有人的地理分布。该文件由 QuIC 知识产权&#xff08;IP&#xff09;与贸易…

【学习笔记】Python 使用 matplotlib 画图

文章目录 安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图&#xff0c;记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib中文显示 新版的 matplotlib 已经支持字体回退…

Linux Docker下载镜像更改默认存储位置/usr/lib/docker

用于解决docker默认存储位置磁盘空间不足&#xff0c;切换存储位置 1、执行下面命令查看 现在docker的存储位置 docker info | grep "Docker Root Dir" 1.2、如果之前已经下载过镜像可以用mv命令把原来的镜像复制到新的地址 mv /var/lib/docker /data/docker 2、…

vue3中的ref、isRef、shallowRef、triggerRef和customRef

1.ref 接受一个参数值并返回一个响应式且可改变的 ref 对象。 ref 对象拥有一个指向内部值的单一属性 .value property &#xff0c;指向内部值。 例&#xff1a;此时&#xff0c;页面上的 str1 也跟着变化 <template><div><button click"handleClick&quo…

RK3588构建ubuntu22.04根文件系统

前言 RK系列的平台提供了buildroot和debian的系统&#xff0c;使用脚本可以直接构建出来&#xff0c;但是没有提供ubuntu的系统&#xff0c;很多厂商只提供一个rootfs.img的固件包&#xff0c;没有将方法开源出来。本文实现了从ubuntu官网开始构建一个ubuntu22.04根文件系统。…

python数字验证码自动识别

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在网络上&#xff0c;许多网站和应用程序使用验证码&#xff08;Completely Automated Publ…

Vue2 —— 学习(十一)

目录 一、路由 vue-router &#xff08;一&#xff09;路由与路由器 &#xff08;二&#xff09;vue-router 理解 &#xff08;三&#xff09;SPA 理解 &#xff08;四&#xff09;路由 理解 &#xff08;五&#xff09;小案例 1.About.vue 2.Home.vue 3.index.js 4…

移动端应用(APP)如何设计测试用例?

为 APP 设计测试用例需要考虑移动设备的特殊性&#xff0c;如不同的操作系统、设备尺寸、硬件特性以及应用程序自身的特定功能。 以下是为APP设计测试用例时要考虑的内容&#xff1a; 1. 理解需求 熟悉APP的功能需求、用户故事和设计文档。 确定APP的目标用户群体、使用场景…

12.Blender 界面介绍(上)及物体基础编辑操作

设置语言 首先在菜单栏打开编辑-Preferences-界面-翻译&#xff0c;可以修改语言 这里使用的是Steam上下载的4.1版本 工具栏 左边的工具栏&#xff0c;按T就会出现&#xff0c;再按T就会隐藏 右边的工具栏是按N&#xff0c;按N显示&#xff0c;再按N隐藏 旋转画面 长按鼠…

MySQL基础之单表操作(定义DDL,增删改DML,查DQL)

目录 一、概述1.1 什么是数据库1.2 连接MySQL1.3 数据模型1.4 SQL语句的分类1.5 数据类型 二、数据库设计-DDL2.1 数据库层面2.2 数据表层面创建表约束查询修改add,modify,change,drop,rename(表)删除 三、数据库操作-DML3.1 添加数据insert3.2 修改数据update3.3 删除数据dele…

做外贸与其质疑,不如脚踏实地做事

小莉说最近好多自媒体添加WhatsApp的客户都是非洲的&#xff0c;有些打电话过来都不想接&#xff0c;因为他们都是没钱的主&#xff0c;接着还截图了一个客户头像给我&#xff0c;很不耐烦地说&#xff1a;像这种抽烟的客户头像&#xff0c;一看就不是正经人&#xff0c;无论他…

土压力计:监测地下压力变化的必备工具

在土木工程、地质勘探和地下建筑等领域&#xff0c;地下土壤的力学特性对工程的稳定性和安全性起着至关重要的作用。而土压力计作为一种重要的监测设备&#xff0c;能够准确地测量地下土壤的压力变化&#xff0c;为工程设计和施工提供关键数据。本文将探讨土压力计的原理、应用…