最近在优化一个办公系统,需要计算请假时间

首先要实现请假时间的计算,需要以下几步

第一步、首先我们要知道时间表(我们以最常用的 上午上班时间(09:00 - 12:00)下午(13:00 - 18:00)为例)

第二步,我们分析可能出现的可能性

1、早上请假

2、下午请假

3、跨中午请假

4、跨天但又不满一天请假

5、跨天满一天请假

6、跨周请假(需要除去周末)

7、节假日请假 (需要除去节假日)---一般节假日是预设的,这个功能暂时没有实现

第三步:细分析

我们发现,在当请假不满一天的时候,早上请假和下午请假都是在上班时间内,这样我们直接用下午时间减去上午时间就行,所以,上午请假和下午请假一共可以归为一类:所以一共可能有一下几种情况:

1、早上请假,下午请假

2、跨中午请假

3、跨天但又不满一天请假

4、跨天满一天请假

5、跨周请假(需要除去周末)

6、节假日请假 (需要除去节假日)---一般节假日是预设的,这个功能暂时没有实现

第四步:我们还需要考虑。年假 病假 事假 抵扣等各种情况

第五步:直接上代码

计算时间代码:

// 计算两段时间工作日工时
calculate (startTime, endTime) {if (startTime >= endTime) {return 0}const lastDay = this.getLastDay(endTime.getFullYear(), endTime.getMonth() + 1)startTime = this.carryTime(startTime)endTime = this.carryTime(endTime)let totalTime = 0if (startTime.getDay() === 6 || startTime.getDay() === 0) {totalTime = endTime.getDate() - startTime.getDate()} else {totalTime = Math.floor(((endTime - startTime) / (3600 * 1000)) / 24)}const tempStartTime = new Date()tempStartTime.setTime(startTime.getTime())let temp = 0if (endTime.getDate() === lastDay) {while (tempStartTime.getDate() <= endTime.getDate()) {if (tempStartTime.getDay() === 6 && tempStartTime.getDay() === 0) {totalTime--}tempStartTime.setDate(tempStartTime.getDate() + 1)if (tempStartTime.getDate() === 31) {break}}} else {while (tempStartTime.getDate() <= endTime.getDate()) {if (tempStartTime.getDay() === 6 || tempStartTime.getDay() === 0) {totalTime--}tempStartTime.setDate(tempStartTime.getDate() + 1)}}if (startTime.getHours() <= 12 && endTime.getHours() >= 13) {temp += -0.1}if (startTime.getHours() * 60 + startTime.getMinutes() !== endTime.getHours() * 60 + endTime.getMinutes()) {do {if (startTime.getDay() === 6 || startTime.getDay() === 0) {startTime.setDate(startTime.getDate() + 1)startTime.setHours(9)startTime.setMinutes(0)continue}if (startTime.getHours() * 60 + startTime.getMinutes() >= 9 * 60 && startTime.getHours() * 60 + startTime.getMinutes() < 18 * 60) {temp += 0.05}startTime.setTime(startTime.getTime() + 0.5 * 3600 * 1000)} while (startTime.getHours() * 60 + startTime.getMinutes() !== endTime.getHours() * 60 + endTime.getMinutes())}totalTime += Math.floor(temp / 0.8)totalTime += temp % 0.8totalTime = Math.round(totalTime * 100) / 100const days = Math.floor(totalTime)const hours = Math.round((totalTime - days) * 100) / 10const duration = days * 8 + hoursreturn duration
},
carryTime (date) {if (date.getMinutes() > 0 && date.getMinutes() < 15) {date.setMinutes(0)}if (date.getMinutes() >= 15 && date.getMinutes() < 30) {date.setMinutes(30)}if (date.getMinutes() > 30 && date.getMinutes() < 45) {date.setMinutes(30)}if (date.getMinutes() >= 45) {date.setHours(date.getHours() + 1)date.setMinutes(0)}return date
},
// 获取每个月最后一天
getLastDay (year, month) {let new_year = year // 取当前的年份let new_month = month++// 取下一个月的第一天,方便计算(最后一天不固定)if (month > 12) { // 如果当前大于12月,则年份转到下一年new_month -= 12 // 月份减new_year++ // 年份增}const new_date = new Date(new_year, new_month, 1)return (new Date(new_date.getTime() - 1000 * 60 * 60 * 24)).getDate()// 获取当月最后一天日期
},

年假事假抵扣代码:

timeCheck () {const totalHours = this.dateDiff / (3600 * 1000)switch (this.levelForm.type) {case 1: { // 年假// 不足半天按半天计算,// 超过半天按一天计算return this.annualLeave >= (totalHours / 8)}case 2: { // 病假// 不足半天按半天计算,// 超过半天按一天计算return this.sickLeave >= (totalHours / 8)}case 3: // 事假return truecase 4: { // 抵扣return this.deduction >= totalHours}default:return false}
}

大体界面如下:

时间间隔为半小时,年假必须时长必须半天或以上才行(这个element 有详细介绍我就不说了)

关于请假申请的时间计算相关推荐

  1. 请假时间计算----开始时间不是17点之后算一天,排除周日和节假日

    public String calLeaveDays(Date startTime, Date endTime, Integer vacateType) {// Integer vacateType; ...

  2. OA系统十九:请假申请五:【请假申请】这个内嵌页面的前台文件;设置【点击左侧菜单栏的“请假申请”后】在首页的“功能区”显示【请假功能】这个内嵌页面;

    本篇博客的主要内容是: 本篇博客有几点特别说明下: (1)前端的东西挺复杂的,感受到了[学会一个成熟的前端框架]的重要性.毕竟,框架可以提高前段文件的开发效率,简化开发步骤! (2)前端的Ajax请求 ...

  3. OA系统十七:请假申请三:【请假申请】这个内嵌界面中【提交请假表单数据】的Service层;(PS:在EmployeeDao中初次遇到@Param()参数设置)

    本篇博客的主要内容是:  本篇博客的需要注意的点有: (1)根据业务需求,规划好整体的代码结构和编码逻辑: (2)一种目前认可的编程小细节:(PS:随着以后经验增多,可能会抛弃这种想法,或者有其他理解 ...

  4. OA系统十五:请假申请一:【请假申请】这个内嵌界面的数据库设计;(即请假申请这个线型工作流程的数据库设计!)

    本篇博客的主要内容是:设计[请假申请]相关的数据表: 目录 一:[多级请假审批流程]的数据库设计:分析 1.请假工作流程图 2.工作流程表的设计分析 3.设计约束 二:具体表设计 1.leaveFor ...

  5. OA系统十八:请假申请四:【请假申请】这个内嵌界面中【提交请假表单数据】的Controller层;

    本篇博客的主要内容是: 本篇博客需要注意的点: (1)一种策略,或称之为一种思想:一个Controller的url设置成通配符的形式,从而实现不同的请求调用不同方法: (2)加深感受下Session这 ...

  6. 高德地图路径规划接口计算出发地与目的地的通行时间计算

    计算两点之间通行时间,可以借助gis的网络分析实现,但网络分析需要较为完整的路网数据,且分析过程复杂,借助高德地图路径规划接口可实现不同交通方式下,两点之间的通行时间计算,快速简洁.本文以驾车方式为例 ...

  7. FPGA的设计艺术(4)STA实战之不同时序路径的建立保持时间计算

    前言 本文首发:FPGA的设计艺术(4)STA实战之不同时序路径的建立保持时间计算 STA定义 STA定义为:时序验证,可确保各种电路时序是否满足各种时序要求. ASIC / FPGA设计流程中最重要 ...

  8. Executors线程池关闭时间计算

    Executors线程池关闭时间计算 学习了:http://blog.csdn.net/wo541075754/article/details/51564359 https://www.cnblogs ...

  9. python-opencv时间计算,视频物体追踪标记

    程序运行的时间计算 **# -*- coding: utf-8 -*- """ @author: Andrew """ import cv2 ...

最新文章

  1. 为女儿取名“王者荣耀”可想过代价?
  2. 51Nod- 1915 西湖游船
  3. 【MCtalk活动推荐】IM快速搭建即时通讯实战
  4. Java 算法 开心的金明
  5. matlab矩阵里的最大值和最小值,求助 Matlab 用MAGIC命令产生一个5阶矩阵,并求该矩阵每列的最大值、最小值、平均数、和...
  6. 《Redis官方教程》-Redis安全
  7. 太戈编程DEVC++教师答案库
  8. 局域网文件服务器单独文件夹加密,局域网 如何给共享文件夹加密
  9. 《计算机科学概论》目录—导读
  10. 语音合成 TTS 相关的一些总结
  11. Scratch3.0创意编程(基础篇):第10课 接苹果
  12. 调用微信内置浏览器实现微信打开的网页上的图片能点击打开的效果
  13. 一台计算机两个硬盘怎么设置密码,怎样给硬盘加密码? 两招解决硬盘加密难题...
  14. 文件加密系统是如何实现企业数据高效安全保护的?
  15. 安卓手机便签怎么快速修改重复提醒设置?
  16. 几种基本的数字正则表达式[转]
  17. 路由器的CPU和存储器
  18. 义乌购API,item_search - 根据关键词取商品列表
  19. Kotlin 1.4 和未来值得期待的地方
  20. Linux粘滞位简析

热门文章

  1. 解决问题:xshell6评估已过期
  2. 花了1个月时间,把Python库全部整理出来了,覆盖所有,建议收藏
  3. 2017web前端校招面试总结 - 陌陌技术保障组
  4. u-boot 自定义命令
  5. 27U、42U、47U常见机柜设备布局图详解【转载自微信公众号弱电课堂】
  6. 万字拆解!追溯ChatGPT各项能力的起源
  7. 一个生成公章图片的简易工具
  8. 【淘宝商品上架接口】为什么店铺流量访客很高,但是转化却非常的低
  9. 7-104 三天打鱼两天晒网
  10. String字符串截取几种方法