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

public String calLeaveDays(Date startTime, Date endTime, Integer vacateType) {
//        Integer vacateType;//请假类型 4是产假
        if (vacateType==null) vacateType=6;
        int leaveDays = 0;
        //从startTime开始循环,若该日期不是节假日或者不是周六日则请假天数+1
        Date 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开始循环,若该日期不是节假日或者不是周六日则请假天数+1
        Date 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){//日期+1
            startHour=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 + "小时";
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值