java 把一个时间段中的节假日和周末过滤掉,获得一个或多个时间段

工作中遇到这种需求了,就写了一个方法,测试了几种情况都没有问题

代码中的工具类用的hutool,不能用第三方包的话,可以把工具类的api都换成自己写的计算方法

 /**
     * 处理单个时间段中的节假日
     *
     * @param m 时间段
     * @return 处理过后的一个或多个时间段
     */
    public static List<Map<String, Date>> dispose(Map<String, Date> m, List<String> holidays, List<String> workDays) {
        String ymd = "yyyy-MM-dd";
        Date st = DateUtil.beginOfDay(m.get("st")).toJdkDate();
        Date et = DateUtil.beginOfDay(m.get("et")).toJdkDate();

        if (st == null || et == null) {
            return new ArrayList<>();
        }

        List<Map<String, Date>> result = new ArrayList<>();
        long betweenDay = DateUtil.betweenDay(st, et, true) + 1;
        for (int i = 0; i < betweenDay; i++) {
            if (DateUtil.beginOfDay(st).compareTo(DateUtil.beginOfDay(et)) > 0) {
                break;
            } else if (st.compareTo(et) == 0) {
                String last = DateUtil.format(st, ymd);
                if (workDays.contains(last) || (!holidays.contains(last) && !DateTime.of(st).isWeekend())) {
                    Map<String, Date> map = new HashMap<>();
                    map.put("st", st);
                    map.put("et", et);
                    result.add(map);
                }
                break;
            }

            if (holidays.contains(DateUtil.format(st, ymd))) {
                st = DateUtil.offsetDay(st, 1).toJdkDate();
            } else if (workDays.contains(DateUtil.format(st, ymd))) {
                Date beginT = st;
                Date endT = st;
                long betweenDay1 = DateUtil.betweenDay(st, et, true) + 2;
                for (int j = 0; j < betweenDay1; j++) {
                    st = DateUtil.offsetDay(st, 1).toJdkDate();
                    if (holidays.contains(DateUtil.format(st, ymd))) {
                        Map<String, Date> map = new HashMap<>();
                        map.put("st", beginT);
                        map.put("et", endT);
                        result.add(map);
                        break;
                    } else if (workDays.contains(DateUtil.format(st, ymd))) {
                        if (st.compareTo(et) > 0) {
                            Map<String, Date> map = new HashMap<>();
                            Date zt = DateUtil.offsetDay(st, -1).toJdkDate();
                            map.put("st", beginT);
                            map.put("et", zt);
                            result.add(map);
                            break;
                        }
                        endT = st;
                    } else {
                        if (DateTime.of(st).isWeekend()) {
                            Map<String, Date> map = new HashMap<>();
                            map.put("st", beginT);
                            map.put("et", endT);
                            result.add(map);
                            break;
                        } else {
                            if (st.compareTo(et) > 0) {
                                Map<String, Date> map = new HashMap<>();
                                Date zt = DateUtil.offsetDay(st, -1).toJdkDate();
                                map.put("st", beginT);
                                map.put("et", zt);
                                result.add(map);
                                break;
                            }
                            endT = st;
                        }
                    }
                }
                st = DateUtil.offsetDay(endT, 2).toJdkDate();
            } else {
                if (DateTime.of(st).isWeekend()) {
                    st = DateUtil.offsetDay(st, 1).toJdkDate();
                } else {
                    Date beginT = st;
                    Date endT = st;
                    long betweenDay1 = DateUtil.betweenDay(st, et, true) + 2;
                    for (int j = 0; j < betweenDay1; j++) {
                        st = DateUtil.offsetDay(st, 1).toJdkDate();
                        if (holidays.contains(DateUtil.format(st, ymd))) {
                            Map<String, Date> map = new HashMap<>();
                            map.put("st", beginT);
                            map.put("et", endT);
                            result.add(map);
                            break;
                        } else if (workDays.contains(DateUtil.format(st, ymd))) {
                            if (st.compareTo(et) > 0) {
                                Map<String, Date> map = new HashMap<>();
                                Date zt = DateUtil.offsetDay(st, -1).toJdkDate();
                                map.put("st", beginT);
                                map.put("et", zt);
                                result.add(map);
                                break;
                            }
                            endT = st;
                        } else {
                            if (DateTime.of(st).isWeekend()) {
                                Map<String, Date> map = new HashMap<>();
                                map.put("st", beginT);
                                map.put("et", endT);
                                result.add(map);
                                break;
                            } else {
                                if (st.compareTo(et) > 0) {
                                    Map<String, Date> map = new HashMap<>();
                                    Date zt = DateUtil.offsetDay(st, -1).toJdkDate();
                                    map.put("st", beginT);
                                    map.put("et", zt);
                                    result.add(map);
                                    break;
                                }
                                endT = st;
                            }
                        }


                    }
                    st = DateUtil.offsetDay(endT, 2).toJdkDate();
                }
            }
        }
        return result;
    }

输出结果:

还有一个计算多个时间段中重复天数的方法,有需要可以看这里:java 计算多个时间段中重复的天数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿演

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值