java 两个时间段之间的工作日计算

java代码实现oa请假逻辑

核心逻辑

1、拆分开始时间和结束时间
2、遍历两个时间点的所有数据并提出周末时间
3、对工作时间进行处理
4、对超过工作时间的时间进行处理
5、处理请假中的第一天和最后一天的数据进行特殊处理
6、汇总这个时间段上的请假时间

补班和法定节假日没有在处理

目前的思路是:法定节假日和补班是每年发布的。这里没做处理。

public RetDataBean compareHolidays(String dataNum5, String dataNum6) {
        try{
            System.out.println(dataNum5 +" "  + dataNum6) ;
            String compareData="";
//    1、将假期拆分yyyy-mm-dd   开始时间   r 切割时间
            String[] dataNum5List = dataNum5.split(" ");
            String num5Time = dataNum5List[1];  // 开始时间对应的时间
            String num5Year = dataNum5List[0];  // 开始时间对应的年月日

            String[] dataNum6List = dataNum6.split(" ");
            String num6Time = dataNum6List[1]; // 结束时间对应的时间
            String num6Year = dataNum6List[0]; // 结束时间对应的年月日

//            计算两个假期中间的天数,返回为周一到周五之间的工作日
            List<LocalDate> localDates = DateUtils.querySelectSumary(num5Year, num6Year);
            //TODO  去掉假期中的法定节假日
            //TODO 加上补班的日期,此日期必须是周六或者周日

            //            2、开始时间不是9点,手动设置为9点
            Integer num5TimeInt = Integer.valueOf(num5Time);
            if(num5TimeInt<= WORK_STATE_TIME ){
                num5TimeInt = WORK_STATE_TIME;
            }
//             3、结束时间 不是17点手动设置为17点
            Integer num6TimeInt = Integer.valueOf(num6Time);
            if(num6TimeInt >=WORK_END_TIME) {
                num6TimeInt = WORK_END_TIME;
            }

            Integer total =0;  // 设置局部变量,便于计算两天的时间差
//            Integer diff = 0 ;

            if(ObjectUtil.isEmpty(localDates)){ // 这两个日期为周末,没有任何时间差返回
                compareData = "0";
            }else {
                int size = localDates.size();
                if(1 == size){// 表示请假天数为当天之内  只需要时间做减法即可
                    int i = num6TimeInt - num5TimeInt;
                    // 借宿时间在12点以后, 开始时间在9点到12点之间需要减1
                    if(num6TimeInt >WORK_REST_TIME &&(num5TimeInt >= WORK_STATE_TIME && num5TimeInt <= WORK_REST_TIME)){
                         i--;
                    }
                    if(i >0){
                        compareData = i +"";
                    }else{
                        compareData="0";
                    }
                }else{  // 多天的假期计算,需要对日期进行多次梳理
                    if(num5TimeInt>=WORK_STATE_TIME && num5TimeInt <=WORK_REST_TIME){ // 上午区间   -1为中午休息时间
                        total =  WORK_END_TIME-num5TimeInt -1;
                    }else if(num5TimeInt >= WORK_END_TIME){
                        total =0;
                    }else{
                        total =  WORK_END_TIME-num5TimeInt;
                    }
                    if(num6TimeInt < WORK_STATE_TIME){
                        size --;
                        compareData=((size -1)*DAY_WORK_TIME+total)+"";
                    } else  if(num6TimeInt >=WORK_STATE_TIME && num6TimeInt <=WORK_REST_TIME){
                        total += num6TimeInt -WORK_STATE_TIME;
                        compareData=((size -2)*DAY_WORK_TIME+total)+"";
                    }else{
                        total += num6TimeInt -WORK_STATE_TIME -1;
                        compareData=((size -2)*DAY_WORK_TIME+total)+"";
                    }
                    System.out.println(total +" : "+ compareData);
                }
            }
            return RetDataTools.Ok(compareData);
        } catch (Exception e) {
            return RetDataTools.Error();
        }

    }

对应的工具类

public static List<LocalDate> querySelectSumary(String startTime, String endTime){
        List<LocalDate> list = new ArrayList<>(1024);
        LocalDate startDate = LocalDate.parse(startTime); // 开始日期
        LocalDate endDate = LocalDate.parse(endTime); // 结束日期
        long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); // 计算开始日期和结束日期之间的天数
        for (int i = 0; i <= daysBetween; i++) {
            LocalDate currentDate = startDate.plusDays(i);
            String state=currentDate.getDayOfWeek().getValue() > 5 ? "0": "1";  //判断是否是工作日
            if("1".equals(state)){  // 获取的工作日
                list.add(currentDate);
            }
        }
        return  list;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值