Merge pull request #2725 from CherryRum/qa

refactor(DateUtil、LocalDateTimeUtil): 添加区间退化为点,点与区间,点与点之间关系判断。
This commit is contained in:
Golden Looly 2022-11-11 11:59:13 +08:00 committed by GitHub
commit 654eb0fc71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 10 deletions

View File

@ -2229,13 +2229,18 @@ public class DateUtil extends CalendarUtil {
/**
* 检查两个时间段是否有时间重叠<br>
* 重叠指两个时间段是否有交集
*
* 重叠指两个时间段是否有交集注意此方法时间段重合时如
* <ul>
* <li>此方法未纠正开始时间小于结束时间</li>
* <li>当realStartTime和realEndTime或startTime和endTime相等时,退化为判断区间是否包含点</li>
* <li>当realStartTime和realEndTime和startTime和endTime相等时,退化为判断点与点是否相等</li>
* </ul>
* See <a href="https://www.ics.uci.edu/~alspaugh/cls/shr/allen.html">准确的区间关系参考:艾伦区间代数</a>
* @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;
}
/**

View File

@ -538,13 +538,18 @@ public class LocalDateTimeUtil {
/**
* 检查两个时间段是否有时间重叠<br>
* 重叠指两个时间段是否有交集
*
* 重叠指两个时间段是否有交集注意此方法时间段重合时如
* <ul>
* <li>此方法未纠正开始时间小于结束时间</li>
* <li>当realStartTime和realEndTime或startTime和endTime相等时,退化为判断区间是否包含点</li>
* <li>当realStartTime和realEndTime和startTime和endTime相等时,退化为判断点与点是否相等</li>
* </ul>
* See <a href="https://www.ics.uci.edu/~alspaugh/cls/shr/allen.html">准确的区间关系参考:艾伦区间代数</a>
* @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;
}
/**

View File

@ -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

View File

@ -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