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 3bf7f6969..65ad93c55 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 @@ -451,6 +451,75 @@ public class LocalDateTimeUtil { return Period.between(startTimeInclude, endTimeExclude); } + + /** + * 判断指定时间time是否在开始时间startTime和结束时间endTime范围内。 + *

+ * 通过isIncludeStart, isIncludeEnd参数控制时间范围区间是否为开区间 + *

+ * 例如:传入参数:isIncludeStart=true, isIncludeEnd=false + *

+ * 则本方法会判断 time ∈ (start, end] 是否成立 + * + * @param time 被比较的时间 + * @param start 开始时间, 应小于等于结束时间 + * @param end 结束时间,应大于等于开始时间 + * @param isIncludeStart 时间范围是否包含开始时间 + * @param isIncludeEnd 时间范围是否包含结束时间 + * @return true-在范围内,false-不在范围内 + * @author FengBaoheng + * @since 5.8.6 + */ + public static boolean isBetween(LocalDateTime time, LocalDateTime start, LocalDateTime end, + boolean isIncludeStart, boolean isIncludeEnd) { + // 先判断是否满足 time ∈ (start, end) + boolean isBetween = time.isAfter(start) && time.isBefore(end); + + // 若不满足,则再判断是否在时间范围的边界上 + if (!isBetween && isIncludeStart) { + isBetween = time.equals(start); + } + + if (!isBetween && isIncludeEnd) { + isBetween = time.equals(end); + } + + return isBetween; + } + + /** + * 判断指定时间time是否在开始时间startTime和结束时间endTime范围内。 + *

+ * 也即判断 time ∈ [startTime, endTime] 是否成立 + * + * @param time 被比较的时间 + * @param startTime 开始时间, 应小于等于结束时间 + * @param endTime 结束时间,应大于等于开始时间 + * @return true-在范围内,false-不在范围内 + * @author FengBaoheng + * @since 5.8.6 + */ + public static boolean isBetween(LocalDateTime time, LocalDateTime startTime, LocalDateTime endTime) { + return isBetween(time, startTime, endTime, true, true); + } + + + /** + * 判断当前时间(默认时区)是否在开始时间startTime和结束时间endTime范围内。 + *

+ * 也即判断 当前时间 ∈ [startTime, endTime] 是否成立 + * + * @param startTime 开始时间, 应小于等于结束时间 + * @param endTime 结束时间,应大于等于开始时间 + * @return true-在范围内,false-不在范围内 + * @author FengBaoheng + * @since 5.8.6 + */ + public static boolean isBetween(LocalDateTime startTime, LocalDateTime endTime) { + return isBetween(LocalDateTimeUtil.now(), startTime, endTime); + } + + /** * 修改为一天的开始时间,例如:2020-02-02 00:00:00,000 * 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 f99b49e81..4e8226b14 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 @@ -139,6 +139,33 @@ public class LocalDateTimeUtilTest { Assert.assertEquals(365, between.toDays()); } + @Test + public void isBetween() { + // 时间范围 8点-9点 + LocalDateTime start = LocalDateTime.parse("2019-02-02T08:00:00"); + LocalDateTime end = LocalDateTime.parse("2019-02-02T09:00:00"); + + // 不在时间范围内 用例 + Assert.assertFalse(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-02T06:00:00"), start, end)); + Assert.assertFalse(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-02T13:00:00"), start, end)); + Assert.assertFalse(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-01T08:00:00"), start, end)); + Assert.assertFalse(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-03T09:00:00"), start, end)); + + // 在时间范围内 用例 + Assert.assertTrue(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-02T08:00:00"), start, end)); + Assert.assertTrue(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-02T08:00:01"), start, end)); + Assert.assertTrue(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-02T08:11:00"), start, end)); + Assert.assertTrue(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-02T08:22:00"), start, end)); + Assert.assertTrue(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-02T08:59:59"), start, end)); + Assert.assertTrue(LocalDateTimeUtil.isBetween(LocalDateTime.parse("2019-02-02T09:00:00"), start, end)); + + // 测试边界条件 + Assert.assertTrue(LocalDateTimeUtil.isBetween(start, start, end, true, false)); + Assert.assertFalse(LocalDateTimeUtil.isBetween(start, start, end, false, false)); + Assert.assertTrue(LocalDateTimeUtil.isBetween(end, start, end, false, true)); + Assert.assertFalse(LocalDateTimeUtil.isBetween(end, start, end, false, false)); + } + @Test public void beginOfDayTest() { final LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");