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;
    }

输出结果:


相关文章
|
7月前
|
Java API Maven
【现成工具】java获取国家法定节假日包含指定月份节假日和周末
【现成工具】java获取国家法定节假日包含指定月份节假日和周末
1082 0
|
1月前
|
Java
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
29 0
|
4月前
|
Java
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
58 0
|
7月前
|
Java 数据安全/隐私保护
【Java用法】java使用javax.mail读取邮箱,SpringBoot javax.mail获取邮件内容,根据时间段筛选邮件,内附代码,拿来即用
【Java用法】java使用javax.mail读取邮箱,SpringBoot javax.mail获取邮件内容,根据时间段筛选邮件,内附代码,拿来即用
127 0
|
8月前
|
存储 Java API
Java实现判断休息日和节假日
Java实现判断休息日和节假日
406 0
|
10月前
|
存储 Java
java 计算多个时间段中重复的天数
工作中遇到这个需求,自己写了一下,测试了几种情况都没有问题。 这里的时间段我是用的map存储的,map里面是一个key为st的开始时间,一个key为et的结束时间。
JAVA判断当前日期是否是工作日,还是节假日
在使用hutool工具包的时候,发现hutool工具包无法判断是否是工作日还是节假日(因为每年节假日各不相同,所以自己写了一个) 当前只有2021年的数据,后续的数据需要等国务院发布 节假日数据来源:国务院办公厅关于2021年部分节假日安排的通知 package cn.hjljy.crawler.demo.holiday; import com.sun.org.apache.xpath.internal.operations.Bool; import java.text.SimpleDateFormat; import java.time.DayOfWeek; import java.t
Java 将两个日期的时间段按照一定天数进行周期切割
Java 将两个日期的时间段按照一定天数进行周期切割
623 0
Java 将两个日期的时间段按照一定天数进行周期切割
Java判断某时间是否在一个时间段
Java判断某时间是否在一个时间段
java 判断两个时间段是否有交集
/* 开始时间 */ Date leftStartDate = feesPreferential.getPreferentialStartTime(); /* 结束时间 */ Date leftEndDate = feesPreferential.
3592 0