Java判断多个时间段是否重合的方法小结

 更新时间:2025年02月23日 11:09:06   作者:骨力  
这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

判断多个时间段是否有间隔

实体类内容

public class DateRangeStr {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM", timezone = "GMT+8")
    private String startDate;//格式:yyyy-MM-dd
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM", timezone = "GMT+8")
    private String endDate;//格式:yyyy-MM-dd
}

主方法内容

//判断多个时间段是否有时间间隔  true无间隔  false有间隔
    public boolean hasNoGaps(List<DateRangeStr> sortedStrRanges) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        if (sortedStrRanges == null || sortedStrRanges.size() <= 0) return false;

        if (sortedStrRanges.size() == 1) return true;

        List<DateRange> timePeriods = new ArrayList<>();
        for (DateRangeStr ss : sortedStrRanges) {
            LocalDate startDate = LocalDate.parse(ss.getStartDate(), formatter);
            LocalDate endDate = LocalDate.parse(ss.getEndDate(), formatter);

            DateRange dr = new DateRange();
            dr.setStartDate(startDate);
            dr.setEndDate(endDate);
            timePeriods.add(dr);
        }

        Collections.sort(timePeriods, Comparator.comparing(DateRange::getStartDate));

        LocalDate previousEndDate = timePeriods.get(0).getEndDate();

        for (int i = 1; i < timePeriods.size(); i++) {
            DateRange currentPeriod = timePeriods.get(i);

            if (previousEndDate.isAfter(currentPeriod.getStartDate())) {
                // 当前时间段的开始日期早于上一个时间段的结束日期,存在重叠,这不一定是问题
                // 但我们仍然将当前时间段的结束日期作为新的previousEndDate
                previousEndDate = currentPeriod.getEndDate();
            } else if ((!previousEndDate.isEqual(currentPeriod.getStartDate()) && !previousEndDate.plusDays(1L).isEqual(currentPeriod.getStartDate()))) {
                // 发现了间隔
                return false;
            } else {
                // 相邻时间段之间没有间隔
                previousEndDate = currentPeriod.getEndDate();
            }
        }

        return true; // 所有时间段都已遍历完毕,且没有发现时间间隔
    }

判断时间段集合是否与某时间段重合

实体类内容

public class TimeInterval {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM", timezone = "GMT+8")
    private String start;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM", timezone = "GMT+8")
    private String end;
}

主方法内容

private static YearMonth parseYearMonth(String input) {
        try {
            return YearMonth.parse(input, MONTH_FORMATTER);
        } catch (Exception e) {
            throw new IllegalArgumentException("Invalid date format: " + input, e);
        }
    }

    public static boolean overlapsOrContainedInIntervals(List<TimeInterval> intervals, String startDate,String endDate) {
        YearMonth yearMonthAStart = parseYearMonth(startDate);
        YearMonth yearMonthAEnd =  parseYearMonth(endDate);

        for (TimeInterval interval : intervals) {
            YearMonth start = parseYearMonth(interval.getStart());
            YearMonth end = parseYearMonth(interval.getEnd());

            // 检查重叠或包含
            if (!start.isAfter(yearMonthAEnd) && !end.isBefore(yearMonthAStart)) {
                return true;
            }
        }

        return false;
    }

到此这篇关于Java判断多个时间段是否重合的方法小结的文章就介绍到这了,更多相关Java判断时间段是否重合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用SpringBoot配置虚拟化路径用于图片的展示

    使用SpringBoot配置虚拟化路径用于图片的展示

    这篇文章主要介绍了使用SpringBoot配置虚拟化路径用于图片的展示方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • IDEA配置SpringBoot热启动,以及热启动失效问题

    IDEA配置SpringBoot热启动,以及热启动失效问题

    这篇文章主要介绍了IDEA配置SpringBoot热启动,以及热启动失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java利用Redis实现消息队列的示例代码

    Java利用Redis实现消息队列的示例代码

    本篇文章主要介绍了Java利用Redis实现消息队列的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 详解RSA加密算法的原理与Java实现

    详解RSA加密算法的原理与Java实现

    这篇文章主要和大家分享非对称加密中的一种算法,那就是 RSA 加密算法。本文介绍了RSA算法的原理与Java实现,感兴趣的小伙伴可以尝试一下
    2022-10-10
  • java开发命名规范总结

    java开发命名规范总结

    包名的书写规范 (Package)推荐使用公司或机构的顶级域名为包名的前缀,目的是保证各公司/机构内所使用的包名的唯一性。包名全部为小写字母,且具有实际的区分意义
    2013-10-10
  • Java 实战项目之在线点餐系统的实现流程

    Java 实战项目之在线点餐系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现一个在线点餐系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java行为型模式中命令模式分析

    Java行为型模式中命令模式分析

    在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时可以使用命令模式来进行设计
    2023-02-02
  • springboot动态加载Echarts柱状图

    springboot动态加载Echarts柱状图

    这篇文章主要为大家详细介绍了springboot动态加载Echarts柱状图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 浅谈SpringBoot内嵌Tomcat的实现原理解析

    浅谈SpringBoot内嵌Tomcat的实现原理解析

    这篇文章主要介绍了浅谈SpringBoot内嵌Tomcat的实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • El表达式使用问题javax.el.ELException:Failed to parse the expression的解决方式

    El表达式使用问题javax.el.ELException:Failed to parse the expression

    今天小编就为大家分享一篇关于Jsp El表达式使用问题javax.el.ELException:Failed to parse the expression的解决方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论