栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

代码中的工具类用的hutool

    public void timeTest() {

        //原时间段集合
        List> list = new ArrayList>() {{

            Map m = new HashMap<>();
            m.put("st", DateUtil.parse("2021-09-30"));
            m.put("et", DateUtil.parse("2021-10-08"));
            add(m);
            Map m2 = new HashMap<>();
            m2.put("st", DateUtil.parse("2021-10-08"));
            m2.put("et", DateUtil.parse("2021-10-12"));
            add(m2);
            Map m3 = new HashMap<>();
            m3.put("st", DateUtil.parse("2021-10-12"));
            m3.put("et", DateUtil.parse("2021-10-12"));
            add(m3);
        }};

        List> resultList = new ArrayList<>();

        //处理节假日
        list.forEach(m -> resultList.addAll(this.dispose(m)));

        resultList.forEach(map -> System.out.println(map.values()));
    }

    
    public List> dispose(Map m) {
        String ymd = "yyyy-MM-dd";
        //节假日,正常来说应该每年的节假日维护在数据库中
        List holidays = new ArrayList() {{
            add("2021-10-01");
            add("2021-10-02");
            add("2021-10-03");
            add("2021-10-04");
            add("2021-10-05");
            add("2021-10-06");
            add("2021-10-07");
        }};
        //法定工作日,也维护在数据库中
        List workDays = new ArrayList() {{
            add("2021-09-26");
            add("2021-10-09");
        }};

        Date st = m.get("st");
        Date et = m.get("et");

        List> result = new ArrayList<>();
        long betweenDay = DateUtil.betweenDay(st, et, true) + 1;
        for (int i = 0; i < betweenDay; i++) {
            if (st.compareTo(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 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);
            } 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);
                    if (holidays.contains(DateUtil.format(st, ymd))) {
                        Map map = new HashMap<>();
                        map.put("st", beginT);
                        map.put("et", endT);
                        result.add(map);
                        break;
                    } else if (workDays.contains(DateUtil.format(st, ymd))) {
                        endT = st;
                    } else {
                        if (DateTime.of(st).isWeekend()) {
                            Map map = new HashMap<>();
                            map.put("st", beginT);
                            map.put("et", endT);
                            result.add(map);
                            break;
                        } else {
                            if (st.compareTo(et) > 0) {
                                Map map = new HashMap<>();
                                DateTime zt = DateUtil.offsetDay(st, -1);
                                map.put("st", beginT);
                                map.put("et", zt);
                                result.add(map);
                                break;
                            }
                            endT = st;
                        }
                    }
                }
                st = DateUtil.offsetDay(endT, 2);
            } else {
                if (DateTime.of(st).isWeekend()) {
                    st = DateUtil.offsetDay(st, 1);
                } 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);
                        if (holidays.contains(DateUtil.format(st, ymd))) {
                            Map map = new HashMap<>();
                            map.put("st", beginT);
                            map.put("et", endT);
                            result.add(map);
                            break;
                        } else if (workDays.contains(DateUtil.format(st, ymd))) {
                            endT = st;
                        } else {
                            if (DateTime.of(st).isWeekend()) {
                                Map map = new HashMap<>();
                                map.put("st", beginT);
                                map.put("et", endT);
                                result.add(map);
                                break;
                            } else {
                                if (st.compareTo(et) > 0) {
                                    Map map = new HashMap<>();
                                    DateTime zt = DateUtil.offsetDay(st, -1);
                                    map.put("st", beginT);
                                    map.put("et", zt);
                                    result.add(map);
                                    break;
                                }
                                endT = st;
                            }
                        }
                    }
                    st = DateUtil.offsetDay(endT, 2);
                }
            }
        }

        return result;
    }

输出结果:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/424224.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号