From 3240406aa9df1a62132b87a324bfa8983012ca0c Mon Sep 17 00:00:00 2001 From: yulin Date: Thu, 10 Nov 2022 22:10:24 +0800 Subject: [PATCH] =?UTF-8?q?refactor(DateUtil=E3=80=81LocalDateTimeUtil):?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E5=8C=BA=E9=97=B4=E9=80=80=E5=8C=96?= =?UTF-8?q?=E4=B8=BA=E7=82=B9=EF=BC=8C=E7=82=B9=E4=B8=8E=E5=8C=BA=E9=97=B4?= =?UTF-8?q?=EF=BC=8C=E7=82=B9=E4=B8=8E=E7=82=B9=E4=B9=8B=E9=97=B4=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=E5=88=A4=E6=96=AD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://gitee.com/dromara/hutool/issues/I60JMT --- .../main/java/cn/hutool/core/date/DateUtil.java | 15 ++++++++++----- .../cn/hutool/core/date/LocalDateTimeUtil.java | 15 ++++++++++----- .../java/cn/hutool/core/date/DateUtilTest.java | 5 +++++ .../hutool/core/date/LocalDateTimeUtilTest.java | 7 +++++++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index 8b53d8e9e..0b9fe07be 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -2229,13 +2229,18 @@ public class DateUtil extends CalendarUtil { /** * 检查两个时间段是否有时间重叠
- * 重叠指两个时间段是否有交集 - * + * 重叠指两个时间段是否有交集,注意此方法时间段重合时如: + * + * See 准确的区间关系参考:艾伦区间代数 * @param realStartTime 第一个时间段的开始时间 * @param realEndTime 第一个时间段的结束时间 * @param startTime 第二个时间段的开始时间 * @param endTime 第二个时间段的结束时间 - * @return true 表示时间有重合 + * @return true 表示时间有重合或包含或相等 * @since 5.7.22 */ public static boolean isOverlap(Date realStartTime, Date realEndTime, @@ -2243,8 +2248,8 @@ public class DateUtil extends CalendarUtil { // x>b||a>y 无交集 // 则有交集的逻辑为 !(x>b||a>y) - // 根据德摩根公式,可化简为 x<=b && a<=y - return startTime.before(realEndTime) && endTime.after(realStartTime); + // 根据德摩根公式,可化简为 x<=b && a<=y 即 realStartTime<=endTime && startTime<=realEndTime + return realStartTime.compareTo(endTime) <=0 && startTime.compareTo(realEndTime) <= 0; } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java index 04ef64845..3b4916aea 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java @@ -538,13 +538,18 @@ public class LocalDateTimeUtil { /** * 检查两个时间段是否有时间重叠
- * 重叠指两个时间段是否有交集 - * + * 重叠指两个时间段是否有交集,注意此方法时间段重合时如: + * + * See 准确的区间关系参考:艾伦区间代数 * @param realStartTime 第一个时间段的开始时间 * @param realEndTime 第一个时间段的结束时间 * @param startTime 第二个时间段的开始时间 * @param endTime 第二个时间段的结束时间 - * @return true 表示时间有重合 + * @return true 表示时间有重合或包含或相等 * @since 5.7.20 */ public static boolean isOverlap(ChronoLocalDateTime realStartTime, ChronoLocalDateTime realEndTime, @@ -552,8 +557,8 @@ public class LocalDateTimeUtil { // x>b||a>y 无交集 // 则有交集的逻辑为 !(x>b||a>y) - // 根据德摩根公式,可化简为 x<=b && a<=y - return startTime.isBefore(realEndTime) && endTime.isAfter(realStartTime); + // 根据德摩根公式,可化简为 x<=b && a<=y 即 realStartTime<=endTime && startTime<=realEndTime + return realStartTime.compareTo(endTime) <=0 && startTime.compareTo(realEndTime) <= 0; } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index 4999287f5..876171f03 100755 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -1071,6 +1071,11 @@ public class DateUtilTest { Assert.assertFalse(DateUtil.isOverlap(realStartTime1,realEndTime1,startTime,endTime)); Assert.assertFalse(DateUtil.isOverlap(startTime,endTime,realStartTime1,realEndTime1)); + + Assert.assertTrue(DateUtil.isOverlap(startTime,startTime,startTime,startTime)); + Assert.assertTrue(DateUtil.isOverlap(startTime,startTime,startTime,endTime)); + Assert.assertFalse(DateUtil.isOverlap(startTime,startTime,endTime,endTime)); + Assert.assertTrue(DateUtil.isOverlap(startTime,endTime,endTime,endTime)); } @Test diff --git a/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java index 9696bbcb2..c66296c98 100755 --- a/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java @@ -245,12 +245,19 @@ public class LocalDateTimeUtilTest { final LocalDateTime startTime = DateUtil.parseLocalDateTime("2022-03-23 05:00:00"); final LocalDateTime endTime = DateUtil.parseLocalDateTime("2022-03-23 13:00:00"); + + Assert.assertFalse(LocalDateTimeUtil.isOverlap(oneStartTime,oneEndTime,realStartTime,realEndTime)); Assert.assertFalse(LocalDateTimeUtil.isOverlap(oneStartTime2,oneEndTime2,realStartTime,realEndTime)); Assert.assertTrue(LocalDateTimeUtil.isOverlap(oneStartTime3,oneEndTime3,realStartTime,realEndTime)); Assert.assertFalse(LocalDateTimeUtil.isOverlap(realStartTime1,realEndTime1,startTime,endTime)); Assert.assertFalse(LocalDateTimeUtil.isOverlap(startTime,endTime,realStartTime1,realEndTime1)); + + Assert.assertTrue(LocalDateTimeUtil.isOverlap(startTime,startTime,startTime,startTime)); + Assert.assertTrue(LocalDateTimeUtil.isOverlap(startTime,startTime,startTime,endTime)); + Assert.assertFalse(LocalDateTimeUtil.isOverlap(startTime,startTime,endTime,endTime)); + Assert.assertTrue(LocalDateTimeUtil.isOverlap(startTime,endTime,endTime,endTime)); } @Test