java 判断两个时间段是否重叠的案例
程序员文章站
2022-03-08 18:08:21
最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找了不少代码。大佬们的思路过于简洁了,有些理解不了。还只是个菜鸟码农,还是多锻炼锻炼自己的思路。思路很简单:定义一个时间段的概念,既然是时间段就...
最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找了不少代码。大佬们的思路过于简洁了,有些理解不了。还只是个菜鸟码农,还是多锻炼锻炼自己的思路。
思路很简单:定义一个时间段的概念,既然是时间段就包含起始时间和终止时间这两个时间点。构造方法要保证起始时间在终止时间之前,这样才是一个有效的时间段概念。
为timeslot这个类定义四个比较先后顺序的方法,分别为:小于、大于、小于等于、大于等于。画张简单的时间线图理解一下就明白了。当整个时间段作为一个整体时,只有时间段小于或大于另一个时间段时,它们才没有重叠的交集。
代码如下,有什么错误还请各位看官帮忙指出
package com.abc.common.util; import lombok.data; import org.springframework.stereotype.component; import java.time.localdatetime; /** * 日期工具类 * <p> * 使用localdatetime存取或判断 * </p> * @see java.time.localdatetime * @date 2020-6-29 10:20:42 */ @component public class dateutil { /** * 判断两个时间段是否重叠 * @param slot1 * @param slot2 * @return */ public static boolean overlapped(timeslot slot1, timeslot slot2) { timeslot previous, next; previous = slot1.starttime.isbefore(slot2.starttime) ? slot1 : slot2; next = slot2.starttime.isafter(slot1.starttime) ? slot2 : slot1; // 这里业务需要,允许时间点的重叠 // 例如某个时间段的起始时间:2020-06-29 00:00:00 // 和另一个时间段的终止时间:2020-06-29 00:00:00 // 它们俩可以有交点。如果不需要这种逻辑只把le改成lt // ,ge改成gt就可 return !(le(previous, next) || ge(previous, next)); } /** * 构造一个时间段 * @param starttime * @param endtime * @return */ public static timeslot buildslot(localdatetime starttime, localdatetime endtime) { return new timeslot(starttime, endtime); } /** * less equal * 小于等于 * @param prev * @param next * @return */ private static boolean le(timeslot prev, timeslot next) { return lt(prev, next) || next.endtime.isequal(prev.starttime); } /** * greater equal * 大于等于 * @param prev * @param next * @return */ private static boolean ge(timeslot prev, timeslot next) { return gt(prev, next) || prev.endtime.isequal(next.starttime); } /** * greater than * 大于 * @param prev * @param next * @return */ private static boolean gt(timeslot prev, timeslot next) { return prev.endtime.isbefore(next.starttime); } /** * less than * 小于 * @param prev * @param next * @return */ private static boolean lt(timeslot prev, timeslot next) { return next.endtime.isbefore(prev.starttime); } /** * 时间段类 */ @data static class timeslot{ private localdatetime starttime; private localdatetime endtime; public timeslot(localdatetime starttime, localdatetime endtime) { if (starttime.isafter(endtime)) { this.starttime = endtime; this.endtime = starttime; } else { this.starttime = starttime; this.endtime = endtime; } } } }
在业务代码中调用:
// ... if (dateutil.overlapped( dateutil.buildslot(begintime, endtime), dateutil.buildslot(begintime1, endtime1) )) { // 时间段有重叠,写下重叠情况的业务代码 } // ...
当然也可以把timeslot这个类拎出来,那样或许更方便。
补充知识:java计算date类时间差的函数
我就废话不多说了,大家还是直接看代码吧~
public static string timedifference(long start, long end) { long between = end - start; long day = between / (24 * 60 * 60 * 1000); long hour = (between / (60 * 60 * 1000) - day * 24); long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60); long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000); string timedifference = day + "天" + hour + "小时" + min + "分" + s + "秒" + ms + "毫秒"; return timedifference; }
以上这篇java 判断两个时间段是否重叠的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。