通过指定时间范围获取工作日天数

通过指定时间范围获取工作日天数

public Result getWorkingDayRange(String startDate, String endDate) {
        Calendar cl1 = Calendar.getInstance();
        Calendar cl2 = Calendar.getInstance();
        try {
            cl1.setTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD, startDate));
            cl2.setTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD, endDate));
        } catch (Exception e) {
            log.info(e.getMessage());
            return Result.error("日期格式非法");
        }
        //获取指定时间段内特殊休息日(星期一到五休息)
        List<String> restDays = new ArrayList<>();
        //获取指定时间段内特殊的工作日(星期六、日工作)
        List<String> workDays = new ArrayList<>();
        //设置特殊日期
        setSpecialDays(cl1, cl2, restDays, workDays);
        int count = 0;
        //设置具体工作日天数
        List<Date> dates = new ArrayList<>();
        while (cl1.compareTo(cl2) <= 0) {
            //如果不是周六或者周日则工作日+1
            if (cl1.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cl1.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
                dates.add(cl1.getTime());
                count++;
                //如果不是周六或者周日,但是该日属于国殊家法定节假日或者特放假日则-1
                if (restDays.contains(DateFormatUtils.format(cl1.getTime(), DateUtils.YYYY_MM_DD))) {
                    dates.remove(cl1.getTime());
                    count--;
                }
            }
            //如果是周六或者周日,但是该日属于需要工作的日子则 +1
            if (workDays.contains(DateFormatUtils.format(cl1.getTime(), DateUtils.YYYY_MM_DD))) {
                dates.add(cl1.getTime());
                count++;
            }
            cl1.add(Calendar.DAY_OF_MONTH, 1);
        }
        WorkingDayRangeVo workingDayRangeVo = new WorkingDayRangeVo();
        List<String> days = new ArrayList<>();
        dates.forEach(date -> days.add(DateFormatUtils.format(date, DateUtils.YYYY_MM_DD)));
        workingDayRangeVo.setCount(count).setDays(days);
        return Result.success(workingDayRangeVo);
    }


    /**
     * 设置特殊日期
     *
     * @param cl1
     * @param cl2
     * @param restDays
     * @param workDays
     * @date 2023/3/21 9:54
     */
    private void setSpecialDays(Calendar cl1, Calendar cl2, List<String> restDays, List<String> workDays) {
        LambdaQueryWrapper<SysHolidayInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.between(SysHolidayInfo::getDate, cl1.getTime(), cl2.getTime());
        //获取已经设定好的节假日与补班信息
        List<SysHolidayInfo> holidayInfoList = this.list(queryWrapper);
        //节假日信息
        List<SysHolidayInfo> holiday = holidayInfoList.stream().filter(x -> "1".equals(x.getType().toString())).collect(Collectors.toList());
        //如果设定好的节假日是周六日,则移除掉
        holiday.removeIf(next -> computeWhetherIsSaturdayAndSunday(next.getDate()));
        List<Date> collect = holiday.stream().map(SysHolidayInfo::getDate).collect(Collectors.toList());
        //设置特殊休息日(星期一到五休息)
        collect.forEach(date -> {
            restDays.add(DateUtils.dateTime(date));
        });
        //调休补班信息
        List<SysHolidayInfo> takeTime = holidayInfoList.stream().filter(x -> "2".equals(x.getType().toString())).collect(Collectors.toList());
        //如果设定好的调休补班是是工作日,则移除掉
        takeTime.removeIf(next -> !computeWhetherIsSaturdayAndSunday(next.getDate()));
        List<Date> dateList = takeTime.stream().map(SysHolidayInfo::getDate).collect(Collectors.toList());
        //设置特殊的工作日(星期六、日工作)
        dateList.forEach(date -> {
            workDays.add(DateUtils.dateTime(date));
        });
    }
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值