目录

1.假设上班时间如下:

2.请假时间计算方式:

3.请假可能存在的情况:

4.实现思路:

5.代码奉上,只需传入时间参数


1.假设上班时间如下:

  1. 上班时间为:08:30:00
  2. 中午休息时间为:12:00:00 到13:30:00
  3. 下班时间:18:00:00
  4. 每次请假必须至少请假半天(例如:08:30到12:00算0.5天   12:00到18:00算0.5天) 以上
  5. 支持2019和2020年国家法定节假日,其他年份请自行添加

2.请假时间计算方式:

  任选两个时间段(无论是从周末、国家节假日开始请假  到  周末、国家节假日结束请假  都支持

2.1.去掉周六周末(但是国家调休的有些班是在周六周末 所以要做判断,如果周六或者周末 是国家规定调休的班,那么就不能去掉,否则去掉)

2.2.去掉国家法定节假日

3.请假可能存在的情况:

3.1. 请假日期和结束日期相同(同一天)  例如:2019-12-10 08:30:00  -  2019-12-10 12:00:00

3.2 .请假日期和结束日期相邻(相邻的两天)例如:2019-12-10 08:30:00  -  2019-12-11 12:00:00

3.3.请假日期和结束日期不相邻(中间有间隔)例如:2019-12-10 08:30:00  -  2019-12-13 12:00:00

4.实现思路:

    分三部分计算各自的请假时间,相加即可

      第一部分:请假的当天的请假总时间(要么是半天,要么是一天)

      第二部分:请假的中间的请假总时间(不包含第一部分和第三部分)  

      第三部分:结束的当天的请假总时间(要么是半天,要么是一天)

5.代码奉上,只需传入时间参数

/*** @param startTime Java接受的格式:Sun Dec 08 08:30:00 GMT+08:00 2019  *                 前端传的格式是  2019-12-08 08:30:00*                                                * @param endTime   和startTime格式是一样的* * @return 返回Map对象   key:leaveDays   value:就是计算结果* *  代码比较新鲜,没有来得及做重构,欢迎大家重构* @throws Exception*/@RequestMapping(value = "calcLeaveTime")@ResponseBodypublic Map<String,String> calcLeaveTime(Date startTime,Date endTime) throws Exception {String goWorkTimeString="08:30:00";String midWorkTimeString="12:00:00";String endWorkTimeString="18:00:00";String[] legalHolidays2019= {//2019国家规定的法定节假日"2019-01-01", "2019-02-04", "2019-02-05", "2019-02-06", "2019-02-07", "2019-02-08","2019-02-09", "2019-02-10","2019-04-05", "2019-04-06", "2019-04-07", "2019-05-01", "2019-06-07", "2019-06-08", "2019-06-09", "2019-09-13", "2019-09-14", "2019-09-15", "2019-10-01", "2019-10-02", "2019-10-03", "2019-10-04", "2019-10-05", "2019-10-06", "2019-10-07"};String[] T2019= {//2019国家规定需要调休的班"2019-02-02","2019-02-03","2019-09-29","2019-10-12"           };String[] legalHolidays2020= {//2020国家规定的法定节假日"2020-01-01","2020-01-24","2020-01-25","2020-01-26","2020-01-27","2020-01-28","2020-01-29","2020-01-30","2020-04-04","2020-04-05","2020-04-06","2020-05-01","2020-05-02","2020-05-03","2020-05-04","2020-05-05","2020-06-25","2020-06-26","2020-06-27","2020-10-01","2020-10-02","2020-10-03","2020-10-04","2020-10-05","2020-10-06","2020-10-07","2020-10-08"};String[] T2020= {//2020国家规定需要调休的班"2020-01-19","2020-02-01","2020-04-26","2020-05-09","2020-06-28","2020-09-27","2020-10-10"                };Map<String, String> map=new HashMap<String, String>();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");String sStartDate= sdf.format(startTime);String sEndDate = sdf.format(endTime);String[] legalHolidays= {};String[] tiaoxiudays= {};System.out.println("传入的请假时间:"+sStartDate+" "+sEndDate);List<Date> lstDays=new ArrayList<Date>();Date startD=sdf.parse(sStartDate);Date endD=sdf.parse(sEndDate);Date newstartD=null;Date newendD=null;Date date=startD;Calendar cal=Calendar.getInstance();cal.setTime(startD);int i = cal.get(Calendar.DAY_OF_WEEK);while (date.equals(endD)||date.before(endD)) {int iFiled=cal.get(Calendar.DAY_OF_WEEK);String strDateString= sdf.format(date);String strCurrentYear=String.valueOf(Calendar.getInstance().get(Calendar.YEAR));String strDateYear=sdf.format(date).split("-")[0];legalHolidays=strDateYear.equals(strCurrentYear)?legalHolidays2019:legalHolidays2020;tiaoxiudays=strDateYear.equals(strCurrentYear)?T2019:T2020;if((iFiled==Calendar.SATURDAY||iFiled==Calendar.SUNDAY||Arrays.asList(legalHolidays).contains(strDateString))&&!Arrays.asList(tiaoxiudays).contains(strDateString)) {//这里就是做的周六周末和国家法定节假日的过滤}else {lstDays.add(date);}cal.add(Calendar.DATE, 1);date=cal.getTime();}SimpleDateFormat sdfTime=new SimpleDateFormat("HH:mm:ss");String sStartTime= "";String sEndTime = "";if(lstDays.size()>0) {//除过节假日后的请假天newstartD=lstDays.get(0);newendD=lstDays.size()==1?newendD=lstDays.get(0):lstDays.get(lstDays.size()-1);//新的开始天和原来的开始天是一样的,那就用原来的请假开始时间  否则就用早上上班时间sStartTime=newstartD.equals(startD)?sdfTime.format(startTime):goWorkTimeString;//新的结束天和原来的结束天是一样的,那就用原来的请假结束时间  否则就用下午下班时间sEndTime=newendD.equals(endD)?sdfTime.format(endTime):endWorkTimeString;}else {System.out.println("请假时间属于国家法定假节日或周六周末,不计算");map.put("leaveDays", "0");return map;}        Boolean sameDayBoolean=newstartD.equals(newendD);//判断是否是同一天Double leaveDays=0.0;if(sameDayBoolean) {//同一天的情况  System.out.println("同一天计算方式");Integer startInteger= Integer.parseInt(sStartTime.split(":")[0]);Integer endInteger= Integer.parseInt(sEndTime.split(":")[0]);String resultString=String.valueOf(endInteger-startInteger);switch (resultString) {case "4":case "6":leaveDays+=0.5;break;case "10":leaveDays+=1;break;default:break;}}else {//不同一天Date sStDate=newstartD;Calendar clCalendar=Calendar.getInstance();clCalendar.setTime(sStDate);clCalendar.add(Calendar.DATE, 1);Date newStDate=clCalendar.getTime();if(newStDate.equals(newendD)) {//相邻天的情况System.out.println("相邻天无间隔计算方式");Integer startInteger= Integer.parseInt(sStartTime.split(":")[0]);Integer endInteger= Integer.parseInt(sEndTime.split(":")[0]);String resultString=String.valueOf(endInteger-startInteger);switch (resultString) {case "0":leaveDays+=1;break;case "4":case "6":leaveDays+=1.5;break;case "10":leaveDays+=2;break;default:break;}}else {//中间有跨天情况System.out.println("有间隔计算方式");for (int j = 1; j < lstDays.size()-1; j++) {leaveDays+=1;}Integer startInteger= Integer.parseInt(sStartTime.split(":")[0]);switch (startInteger.toString()) {case "8":leaveDays+=1;break;case "12":leaveDays+=0.5;break;case "18":leaveDays+=0;break;default:break;}Integer endInteger= Integer.parseInt(sEndTime.split(":")[0]);switch (endInteger.toString()) {case "8":leaveDays+=0;break;case "12":leaveDays+=0.5;break;case "18":leaveDays+=1;break;default:break;}}}map.put("leaveDays", leaveDays.toString());return map;}

    

java后台 计算请假时间(判断了周六周末和法定节假日和国家调休)相关推荐

  1. 计算请假工时,去除周六周末的时间

    做项目时,写到一个请假的模块,需要计算请假工时,去除周六周末,时间为一天8H,8:00-17:00,中午12:00-13:00 为午休时间 function getLeaveTime(startDat ...

  2. sql函数-创建计算工作日函数,除去了周末以及法定节假日,需要新建表做维护(内置本人有道云链接)

    这边创建新表维护是因为每年的法定节假日都不确认是什么时候,并且公司具体放假时间不确定(包括调休什么的) 表中数据主要存放节假日日期 1.新建节假日表 Holiday(三个字段如下) 数据结构: ID ...

  3. Java 根据开始日期和结束日期,获取日期之间的工作日,去除了周末和法定节假日

    输出结果: public static void main(String[] args) { String sd = "2021-02-01"; String ed = " ...

  4. sqlserver计算两个日期之间的工作日(剔除周末及法定节假日)

    sqlserver计算两个日期之间的工作日(剔除周末及法定节假日) create function [dbo].[WorkDay] ( @beginday datetime, @endday date ...

  5. Java计算请假时长(根据规则设置去除节假日、休息日、特殊日期)

    首先选择的日期要判断是不是节假日: 这里是写了工具类获取全年的日期信息. dateUtils工具类 某年第一天可以直接拼接 yyyy-01-01 获取节假日方法: public class DateU ...

  6. 去除法定节假日以及周末,计算请假时间

    业务需要,不废话,直接说核心. 直接上最佳解决方案,那就是动态的获取国家法定节假日(每年都会更新,可维护性更强).并去除周六周末. 当然,有一种比较low的解决方案就是把当年的法定节假日储存到表中或者 ...

  7. [需求总结] 关于 Java 判断是否为工作日、法定节假日

    应用场景 假设我有一个任务,任务一共需要 10 个小时就可以完成.任务开始时间是 2018-3-28,结束时间是 2018-4-8. 我们通过日历可以知道,3-31 和 4-1 是周末,然后 4月份的 ...

  8. java节假日 调休的代码,java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...

    1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取). 2.工具类代码 /** * @author: ...

  9. EXCEL时间计划顺延,并跳过周末以及法定节假日

    首先请原谅我在CSDN这么神圣的殿堂记录EXCEL: 任务与任务之间的关系是Finish-to-Start (FS) 关系,所以一个任务如果延期,会导致其余所有任务都延期.每次遇到这种情况都需要手动一 ...

最新文章

  1. http权威指南-http连接管理
  2. java椭圆按钮_JAVA按钮重载如何实现椭圆按钮
  3. Comcast在美国境内遭遇大面积宕机和连接中断问题
  4. 基于xilinx vivado的XDMA IP的使用详解
  5. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
  6. 用一句话证明你是程序员,你会怎么说
  7. 二叉树:一入递归深似海,从此offer是路人
  8. 【飞行器】基于matlab多源信息融合算法多旋翼无人机组合导航系统【含Matlab源码 1267期】
  9. 职场知识:什么是软件程序员?它是做什么的?
  10. webp图片文件无需转换直接下载成JPG或者gif等其他格式的方法
  11. Nginx+lua开发(OpenResty生态)
  12. 【Selenium】控制当前已经打开的 chrome浏览器窗口
  13. 阿里云块存储团队卓越工程实践
  14. 优麒麟mysql_Ubuntu kylin优麒麟下配置Hive环境
  15. ​QGIS Cloud 一个基于云的 GIS 平台
  16. java.lang.NoClassDefFoundError: Could not initialize class错误原因
  17. 概率语言模型 Probabilistic Language Modeling (一) --- 整体简介
  18. 单片机原理及应用c语言编程,单片机原理及应用(C语言版)
  19. 环境建环计算机应用安工大,环境建环和给水排水工程计算机应用教材内容.doc...
  20. WIN32API讲座7

热门文章

  1. figma、sketch、xd哪个UI设计工具比较好入门
  2. 自定义可存数据的jquery 表情输入框
  3. [转帖] c实现拼音首字母筛选
  4. H3C交换机以太网端口基本配置与管理
  5. JSNES连发和连跳
  6. Windows Azure真实案例:NeoGeo New Media --SQL Azure提高数字媒体资产解决方案的拓展性...
  7. 校内网开心农场游戏的外挂怎么写呢?
  8. 阿里后台四年,想要跳槽字节,艰难4面,已收开发岗offer
  9. 乐学python慕课答案_乐学Python_章节测验,期末考试,慕课答案查询公众号
  10. 在阿里巴巴,我们如何先于用户发现和定位 Kubernetes 集群问题?