最近在做一个功能,需要统计请假天数,按月统计。而实际的请假数据就包括跨月的情况,所以就出现一个这样的问题。要计算本月内的请假天数。实际上就是求两个时间段内的重复天数。

大概有三种思路:

一、常规思路

以程序员的常规思维来看,计算两个时间段内的重复天数,分为多种情况。包括 包含、相交、相离 另外还需要处理边界值。每种情况又有细分,比如包含,如果是请假范围包含月份范围,则取月份范围。如果月份范围包括请假范围,则直接取请假范围。这样一看,逻辑思考上就较为复杂,写出来的代码阅读性就不高,容易出现纰露。

二、非常规思路

再来看看非常规思路,第一种的缺点是逻辑较为复杂,容易出漏洞。那有没有逻辑简单的方法呢?其实我们可以这样,将月份范围内的所有日期全部放到一个list中,然后遍历这个list,每个日期元素在另一个时间段内,则说明当前日期重复。累计计数即可。这种方案,逻辑较为简单,也不会出现什么纰漏,然而却是有一个缺陷,性能不行!如果时间范围大了,用这种方式,岂不是循环越来越大,如果该方法用在循环统计中,就更加损耗性能。

三、进阶思路

那有没有既便于理解,逻辑简单,又比较高性能的方案呢?我们可以用,两个时间段中 较早的结束时间减去较晚的开始时间,这样得到的正数的天数+1就是重复的天数。如果得到的天数小于0则说明两个时间段不重复。是不是非常简单呢!

/** * 判断两个时间段的重叠天数 * @param startDate1 * @param endDate1 * @param startDate2 * @param endDate2 * @return */public static long overLappingDayCount(LocalDate startDate1,LocalDate endDate1,LocalDate startDate2,LocalDate endDate2){ long dayCount=0l; Boolean startBeforeFlag=startDate1.isBefore(startDate2); Boolean endBeforeFlag=endDate1.isBefore(endDate2); // 比较开始时间 LocalDate compareStartDate=null; // 比较结束时间 LocalDate compareEndDate=null; // 取比较晚的开始时间 if(startBeforeFlag){ compareStartDate=startDate2; }else{ compareStartDate=startDate1; } // 取比较早的结束时间 if(endBeforeFlag){ compareEndDate=endDate1; }else{ compareEndDate=endDate2; } // 计算相差天数 用比较早的结束时间-比较晚的开始时间 dayCount=DateUtils.until(compareStartDate,compareEndDate); // 如果相差天数小于0 则说明没有重复天数 返回0即可 if(dayCount<0){ return 0; } // 如果相差天数大于等于0 则 重叠天数需要+1 dayCount++; return dayCount;}public static void main(String[] args) { LocalDate startDate1=DateUtils.parseLocalDate("2020-11-01",DEFAULT_DATE_FORMAT); LocalDate endDate1=DateUtils.parseLocalDate("2020-11-30",DEFAULT_DATE_FORMAT); LocalDate startDate2=DateUtils.parseLocalDate("2020-11-02",DEFAULT_DATE_FORMAT); LocalDate endDate2=DateUtils.parseLocalDate("2020-12-05",DEFAULT_DATE_FORMAT); long dayCount=DateUtils.overLappingDayCount(startDate1,endDate1,startDate2,endDate2); System.out.println(dayCount);}

请假时间计算方式java_java计算两段时间的重复天数相关推荐

  1. 使用Java的Calendar类计算两段时间之间的工作日的天/小时/分钟/秒数

    计算两段时间之间的工作日的天/小时/分钟/秒数 我们能经常遇到一些需求,让获取工作日的时间(当然,调休也上班也是工作日哈!),之前自己给这搞得头大,所以整理总结,把该工具类记录下来,希望大家能用到的时 ...

  2. java工具类-计算相对时间的工具类即两个时间的时间差

    java相对时间的工具类,此类中有两个暴露的方法,相对于当前时间的方法和相对于某时间的方法. 返回String,如:2小时前/3天2时13秒/昨天 具体请运行查看 (DateTimeFormatUti ...

  3. 航季日期的过去+java_Java 将一段时间以周、月、季分割

    工具类MyUtils代码如下所示: public class MyUtils { /** * 以季度分割时间段 * 此处季度是以 12-2月 3-5月 6-8月 9-11月 划分 * @param s ...

  4. php 间隔时间执行任务,PHP间隔一段时间执行代码的方法

    PHP间隔一段时间执行代码的方法 发布于 2015-11-16 18:26:46 | 230 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Pr ...

  5. 计算机运行一段时间黑屏,电脑隔一段时间黑屏

    随着科技的提升,现在基本每个家庭都会有电脑,对于电脑的使用不是很多朋友都熟悉,有时候电脑会隔一段时间就黑屏,如何处理?下面为大家介绍电脑隔一段时间黑屏的解决步骤. 电脑隔一段时间黑屏 步骤1.可能的原 ...

  6. java 两个日期的天数_计算Java 8中两个日期之间的天数

    我知道有很多关于如何获得的问题,但我想要和使用新的Java 8 Date api的例子. 我也知道JodaTime库,但我想要一种没有外部库的工作方式. 功能需要抱怨这些限制: 防止日期保存时间错误 ...

  7. linux系统时间代表,Linux上有两种时间,一种是硬件时间,一种是系统时间

    date 系统时间 clock/hwclock  硬件时钟 cal  日历 date 打印或设置系统日期或时间,以给定格式显示或设置系统时间 +%a显示周 +%A          完整显示周 +%b ...

  8. 时间工具类: 判断两个时间是否是同一月、是否是同一天

    package com.i78dk.machineaudit.common.util;import java.util.Date; import java.text.SimpleDateFormat; ...

  9. java如何计算时间天数差,java计算两个时间相差天数的方法汇总

    问题描述: 输入:两个日期 输出:两个日期相差的天数 具体代码实现 方法1: 通过calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的 年份是 ...

  10. Java计算两个时间的小时差

    /**** 计算两段时间的小时差* @module* @author SJT* @date 2022/12/28* @param startTime* @param endTime* @return: ...

最新文章

  1. 性能计数器自动收集-logman
  2. java8 垃圾收集_面试官:怎么做JDK8的垃圾收集器的调优(面试常问)
  3. wxpython 日志显示框_wxpython与logging模块结合显示实时日志
  4. menisa mysql_实例详细说明linux下去除重复行命令uniq
  5. python 中参数 ,解包和变量的入门
  6. 使用Fiddler监控网易云笔记客户端向服务器定时发送的sync请求
  7. 【安卓开发 】Android初级开发(十)Android中app自动更新版本号比较
  8. python-while循环简单版-练习
  9. 理解redux中Middleware
  10. PHP 循环时间控制缓冲方法
  11. Spring读取xml配置文件的原理与实现
  12. hive表存储格式的转化
  13. NYOJ101 - 两点距离
  14. vb MySQL 导出_将vb中数据库的内容导出到excel中
  15. mysql数据库内连接和外连接的区别
  16. 电场在计算机专业的应用,电磁场毕业论文题目范文 数值计算和教学理论方面本科论文范文8000字...
  17. python数字转中文字符_python数字金额转换为中文大写金额
  18. matlab实现手写数字识别案例,Matlab手写数字识别
  19. 万用表测量电阻图解及使用注意事项
  20. IBM SPSS Statistics频数分析教学

热门文章

  1. 获取手机存储空间大小
  2. 硝烟中的 Scrum 和 XP-我们如何实施 Scrum
  3. 拉线传感器的数显仪表在测量中起到多大的作用
  4. 基于STM32的ch438串口扩展芯片使用
  5. Vue实现点击上传图片预览图片功能
  6. 学习达人榜:学无止尽,追梦无悔
  7. 索尼Z2(L50t)刷CM12教程
  8. python 爬取种子_Python爬虫框架Scrapy 学习笔记 2 ----- 爬取Mininova网站种子文件信息...
  9. MinIO异常the region is wrong; expecting ‘us-east-1‘
  10. java分类Kdd99数据集_【数据】主题分类数据集