public String calLeaveDays(Date startTime, Date endTime, Integer vacateType) {//        Integer vacateType;//请假类型 4是产假if (vacateType==null) vacateType=6;int leaveDays = 0;//从startTime开始循环,若该日期不是节假日或者不是周六日则请假天数+1Date flag = DateUtil.beginOfDay(startTime);//设置循环开始日期Date flagEnd = DateUtil.beginOfDay(endTime);//设置循环结束日期Calendar cal = Calendar.getInstance();Calendar calStart = Calendar.getInstance();calStart.setTime(startTime);Calendar calEnd = Calendar.getInstance();calEnd.setTime(endTime);int startHours = startTime.getHours();int endHours = endTime.getHours();int hour = 0;//从数据库得到节假日的起始日期和终止日期List<HolidayVO> maps = null;try {maps = vacateDao.getHoliday();//maps用于保存符合条件的所有节假日的起始日期和终止日期,如startDate:2017-07-13,endDate:2017-07-14} catch (Exception e) {e.printStackTrace();}int startWeek = calStart.get(Calendar.DAY_OF_WEEK) - 1;//===================校验请假的开始与结束日期是否合法=============================if (vacateType!=4) {//不是产假才去限制开始和结束时间//判断开始和结束的日期是否合法if (maps != null && maps.size() > 0) {for (HolidayVO map : maps) {if ((DateUtil.beginOfDay(startTime).compareTo(map.getBeginDate()) > -1 && DateUtil.beginOfDay(startTime).compareTo(map.getEndDate()) < 1)) {return "-2天0小时";//开始时间是节假日,请重新选择日期!}}} else if (startWeek == 0) {return "-1天0小时";//开始时间是周末,请重新选择!}int endWeek = calEnd.get(Calendar.DAY_OF_WEEK) - 1;//结束日期if (maps != null && maps.size() > 0) {for (HolidayVO map : maps) {if ((DateUtil.beginOfDay(endTime).compareTo(map.getBeginDate()) > -1 && DateUtil.beginOfDay(endTime).compareTo(map.getEndDate()) <= 0)) {return "-4天0小时";//结束时间是节假日,请重新选择!}}} else if (endWeek == 0) {return "-3天0小时";//结束时间是周末,请重新选择!}}//========================一天之内=========================if (DateUtil.beginOfDay(startTime).compareTo(DateUtil.beginOfDay(endTime)) == 0) {hour = endHours - startHours;if (startHours <= 12 && endHours >= 13) --hour;if (hour == 8) {++leaveDays;hour = 0;}return leaveDays + "天" + hour + "小时";}if (vacateType==4) {while (flag.compareTo(endTime) != 1) {cal.setTime(flag);leaveDays = leaveDays + 1;cal.add(Calendar.DAY_OF_MONTH, +1);flag = cal.getTime();}} else {int week;outer:while (flag.compareTo(endTime) != 1) {cal.setTime(flag);
//            //判断是否为周六日
//            week = cal.get(Calendar.DAY_OF_WEEK) - 1;
//            if (week == 0) {//0为周日
//                //跳出循环进入下一个日期
//                cal.add(Calendar.DAY_OF_MONTH, +1);
//                flag = cal.getTime();
//                continue;
//            } else {//判断是否为节假日if (maps != null || !maps.isEmpty()) {inner:for (HolidayVO map : maps) {if (flag.compareTo(map.getBeginDate()) > -1 && flag.compareTo(map.getEndDate()) < 1) {//跳出循环进入下一个日期cal.add(Calendar.DAY_OF_MONTH, +1);flag = cal.getTime();continue outer;}}}
//            }leaveDays = leaveDays + 1;//日期往后加一天cal.add(Calendar.DAY_OF_MONTH, +1);flag = cal.getTime();}}if (startHours < 8) startHours = 8;if (startHours > 17) startHours = 17;if (endHours > 17) endHours = 17;if (endHours < 8) endHours = 8;//=================请假日期不在一天===================//开始时间是8点之前if (startTime.compareTo(endTime) < 0 && startTime.getHours() <= 8 && endTime.getHours() > 8 && endTime.getHours() < 17) {leaveDays--;startHours = 8;}//开始时间是8点到17点之间if (startTime.compareTo(endTime) < 0 && startTime.getHours() > 8 && startTime.getHours() < 17 && endTime.getHours() <= 8) {--leaveDays;--leaveDays;endHours = 17;}if (startTime.compareTo(endTime) < 0 && startTime.getHours() > 8 && startTime.getHours() < 17 && endTime.getHours() > 8 && endTime.getHours() < 17) {--leaveDays;startHours = 8;}if (startTime.compareTo(endTime) < 0 && startTime.getHours() > 8 && startTime.getHours() < 17 && endTime.getHours() >= 17) {startHours = 8;--leaveDays;}//开始时间是17点之后if (startTime.compareTo(endTime) < 0 && startTime.getHours() >= 17 && endTime.getHours() > 8 && endTime.getHours() < 17) {--leaveDays;--leaveDays;startHours = 8;}hour = endHours - startHours;//中午休息时间if (startHours <= 12 && endHours >= 13) --hour;//整数天if (startTime.compareTo(endTime) < 0 && startTime.getHours() <= 8 && endTime.getHours() >= 17) leaveDays--;if (startTime.compareTo(endTime) < 0 && startTime.getHours() <= 8 && endTime.getHours() <= 8) {--leaveDays;hour = 0;}if (startTime.compareTo(endTime) < 0 && startTime.getHours() >= 17 && endTime.getHours() <= 8) {--leaveDays;--leaveDays;hour = 0;}if (startTime.compareTo(endTime) < 0 && startTime.getHours() >= 17 && endTime.getHours() >= 17) {leaveDays--;hour = 0;}if (hour == 8) {leaveDays++;hour = 0;}return leaveDays + "天" + hour + "小时";

优化之后

    /*** 出去节假日,计算两个时间之间的天数** @param startTime* @param endTime* @return*/public String calLeaveDays(Date startTime, Date endTime, Integer vacateType) {//        Integer vacateType;//请假类型 4是产假if (vacateType==null) vacateType=6;int leaveDays = 0;//从startTime开始循环,若该日期不是节假日或者不是周六日则请假天数+1Date flag = DateUtil.beginOfDay(startTime);//设置循环开始日期Date flagEnd = DateUtil.beginOfDay(endTime);//设置循环结束日期Calendar cal = Calendar.getInstance();Calendar calStart = Calendar.getInstance();calStart.setTime(startTime);Calendar calEnd = Calendar.getInstance();calEnd.setTime(endTime);int startHours = startTime.getHours();int endHours = endTime.getHours();int hour = 0;//从数据库得到节假日的起始日期和终止日期List<HolidayVO> maps = null;try {maps = vacateDao.getHoliday();//maps用于保存符合条件的所有节假日的起始日期和终止日期,如startDate:2017-07-13,endDate:2017-07-14} catch (Exception e) {e.printStackTrace();}int startWeek = calStart.get(Calendar.DAY_OF_WEEK) - 1;//===================校验请假的开始与结束日期是否合法=============================if (vacateType!=4) {//不是产假才去限制开始和结束时间//判断开始和结束的日期是否合法if (maps != null && maps.size() > 0) {for (HolidayVO map : maps) {if ((DateUtil.beginOfDay(startTime).compareTo(map.getBeginDate()) > -1 && DateUtil.beginOfDay(startTime).compareTo(map.getEndDate()) < 1)) {return "-2天0小时";//开始时间是节假日,请重新选择日期!}}} else if (startWeek == 0) {return "-1天0小时";//开始时间是周末,请重新选择!}int endWeek = calEnd.get(Calendar.DAY_OF_WEEK) - 1;//结束日期if (maps != null && maps.size() > 0) {for (HolidayVO map : maps) {if ((DateUtil.beginOfDay(endTime).compareTo(map.getBeginDate()) > -1 && DateUtil.beginOfDay(endTime).compareTo(map.getEndDate()) <= 0)) {return "-4天0小时";//结束时间是节假日,请重新选择!}}} else if (endWeek == 0) {return "-3天0小时";//结束时间是周末,请重新选择!}}//========================一天之内=========================if (DateUtil.beginOfDay(startTime).compareTo(DateUtil.beginOfDay(endTime)) == 0) {hour = endHours - startHours;if (startHours <= 12 && endHours >= 13) --hour;if (hour == 8) {++leaveDays;hour = 0;}return leaveDays + "天" + hour + "小时";}//======================多天时间计算=============================cal.setTime(flagEnd);cal.add(Calendar.DAY_OF_MONTH,-1);flagEnd=cal.getTime();//设置结束日期cal.setTime(flag);cal.add(Calendar.DAY_OF_MONTH, +1);flag = cal.getTime();//开始日期if (vacateType==4) {while (flag.compareTo(flagEnd) != 1) {cal.setTime(flag);leaveDays = leaveDays + 1;cal.add(Calendar.DAY_OF_MONTH, +1);flag = cal.getTime();}} else {outer:while (flag.compareTo(flagEnd) != 1) {cal.setTime(flag);//判断是否为节假日if (maps != null || maps.size()>0) {for (HolidayVO map : maps) {if (flag.compareTo(map.getBeginDate()) > -1 && flag.compareTo(map.getEndDate()) < 1) {//跳出循环进入下一个日期cal.add(Calendar.DAY_OF_MONTH, +1);flag = cal.getTime();continue outer;}}}leaveDays = leaveDays + 1;//日期往后加一天cal.add(Calendar.DAY_OF_MONTH, +1);flag = cal.getTime();}}//做小时的校验if (startHours < 8) startHours = 8;if (startHours > 17) startHours = 17;if (endHours > 17) endHours = 17;if (endHours < 8) endHours = 8;int startHour=0;if (startHours>=8&&startHours<=17){//日期+1startHour=17-startHours;//开始当天的小时计算if (startHours<=12&&startHour>0) --startHour;}int endHour=0;if (endHours>=8&&endHours<=17){endHour=endHours-8;if (endHours>=13&&endHour>0)--endHour;}//整数天hour=endHour+startHour;if (hour>=8){leaveDays=leaveDays+hour/8;hour=hour%8;}return leaveDays + "天" +hour + "小时";}

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

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

    目录 1.假设上班时间如下: 2.请假时间计算方式: 3.请假可能存在的情况: 4.实现思路: 5.代码奉上,只需传入时间参数 1.假设上班时间如下: 上班时间为:08:30:00 中午休息时间为:1 ...

  2. java 根据时间范围自动算间隔_Java根据开始时间结束时间计算时间间隔 x年x月x日...

    最近项目中有这样的需求:根据租赁开始时间租赁结束时间计算租期x年x月x日, 相同的需求还有根据出生日期计算年龄等等...... 例如:开始日期 2020年7月24日  结束日期 2021年9月3日   ...

  3. 关于请假申请的时间计算

    最近在优化一个办公系统,需要计算请假时间 首先要实现请假时间的计算,需要以下几步 第一步.首先我们要知道时间表(我们以最常用的 上午上班时间(09:00 - 12:00)下午(13:00 - 18:0 ...

  4. JAVA 给定开始时间和结束时间计算天数

    1.给定开始时间和结束时间计算天数 package com.ceshi;import java.text.ParseException; import java.text.SimpleDateForm ...

  5. python怎样使用各个日期赤纬_行星的上合、下合、大冲、大距、方照、逆行、合月时间计算...

    接上一篇用ephem库计算24节气时间 ,用ephem库可以求得任意时间太阳的视黄经,因而可以求得24节气的时间:同理我们也可以求得任意时间几大行星的视黄经,有了和时间对应的行星黄经值,我们就可以计算 ...

  6. 判断请假时间去除周末及节假日

    公司业务需求,在请假时自动跳过周六周日以及节假日.通过statisticsOfLeaveTime方法,传入请假开始的时间以及请假结束的时间,则可自动统计调休时间. 代码整体逻辑就为拿到请假开始和结束时 ...

  7. cursor is oracle 日期_Oracle时间计算------日期格式参数含义说明

    Oracle时间计算------日期格式参数含义说明 D 一周中的星期几 DAY 天的名字,使用空格填充到9个字符 DD 月中的第几天 DDD 年中的第几天 DY 天的简写名 IW ISO标准的年中的 ...

  8. 计算时间差_小王子是怎么用四步法进行时间计算并成功避开日界线的

    特别申明:本文为原创,转载请注明来源 试题引入: 法国作家圣埃克絮佩里的<小王子>当中有如下一段对话.据此回答10-11题. 小王子:"我喜欢看日落.我们去看一回日落吧--&qu ...

  9. php 日期算法,php日期时间计算,转载

    php日期时间计算,转载 //php获取今天日期 date("Y-m-d"); //php获取昨天日期 date("Y-m-d",strtotime(" ...

最新文章

  1. vc 添加打开文件对话框并读取文件
  2. react中context到底是如何传递的-源码分析
  3. python import出错_Python ImportError: cannot import name urlopen错误分析
  4. Linux ARM交叉编译工具链制作过程
  5. Navicat for MySQL中如何新建用户并赋予权限
  6. web加减乘除法c#_C#的加减乘除的问题
  7. 比国内贵3000元!小米11 Ultra将于5月11日登陆欧洲市场
  8. 计算机科学与技术导论%1计算机网络,汕头大学计算机专业课程计划
  9. 在线文本纵向排版工具
  10. Servlet chapter 3
  11. java 动态属性_Java 类动态添加属性字段的操作
  12. yii框架封装拼多多开放平台sdk
  13. 408 计算机网络 知识点总结
  14. jSignature网页手写签名
  15. python分析股票收益与投资者情绪的关系_投资者情绪与股市收益关系实证研究
  16. Nginx实现白名单灰度发布,杜绝后台不可操控
  17. (C语言)有一个已排好序的数组,要求输入一个数字后,按原来的排序规律将它插入数组
  18. 什么是域名解析,A记录
  19. 全国计算机一级考级考纲,全国计算机等级考试一级MSOffice考试大纲
  20. 领存将发布支持IPMI2.0规范的BMC智能健康管理软件

热门文章

  1. JavaScript|你不知道的CSS属性-Filter(滤镜)
  2. FileZilla连接FTP提示:不安全的服务器,不支持 FTP over TLS
  3. 2017年终总结(小巫)
  4. 算法练习(特辑)设计算法的常用思想
  5. jQuery网页粒子效果背景插件
  6. UE5——动画重定向
  7. C语言程序-计算三角形面积
  8. 菱角图形输出c语言,CDR将多边形/图形的角度变圆?CDR制作圆角图形的三种方法
  9. DSSM双塔模型及pytorch实现
  10. ubuntu下nagios配置