diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java index 9178b4a34..25bfeae79 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java @@ -783,11 +783,7 @@ public class DateTime extends Date { * @since 3.0.8 */ public boolean isIn(final Date beginDate, final Date endDate) { - final long beginMills = beginDate.getTime(); - final long endMills = endDate.getTime(); - final long thisMills = this.getTime(); - - return thisMills >= Math.min(beginMills, endMills) && thisMills <= Math.max(beginMills, endMills); + return DateUtil.isIn(this, beginDate, endDate); } /** 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 3ad82fea7..917fc4a40 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 @@ -1381,11 +1381,49 @@ public class DateUtil extends CalendarUtil { * @since 3.0.8 */ public static boolean isIn(final Date date, final Date beginDate, final Date endDate) { - if (date instanceof DateTime) { - return ((DateTime) date).isIn(beginDate, endDate); - } else { - return new DateTime(date).isIn(beginDate, endDate); + return isIn(date, beginDate, endDate, true, true); + } + + /** + * 当前日期是否在日期指定范围内
+ * 起始日期和结束日期可以互换
+ * 通过includeBegin, includeEnd参数控制日期范围区间是否为开区间,例如:传入参数:includeBegin=true, includeEnd=false, + * 则本方法会判断 date ∈ (beginDate, endDate] 是否成立 + * + * @param date 被检查的日期 + * @param beginDate 起始日期 + * @param endDate 结束日期 + * @param includeBegin 时间范围是否包含起始日期 + * @param includeEnd 时间范围是否包含结束日期 + * @return 是否在范围内 + * @author FengBaoheng + * @since 5.8.6 + */ + public static boolean isIn(final Date date, final Date beginDate, final Date endDate, + final boolean includeBegin, final boolean includeEnd) { + if (date == null || beginDate == null || endDate == null) { + throw new IllegalArgumentException("参数不可为null"); } + + final long thisMills = date.getTime(); + final long beginMills = beginDate.getTime(); + final long endMills = endDate.getTime(); + final long rangeMin = Math.min(beginMills, endMills); + final long rangeMax = Math.max(beginMills, endMills); + + // 先判断是否满足 date ∈ (beginDate, endDate) + boolean isIn = rangeMin < thisMills && thisMills < rangeMax; + + // 若不满足,则再判断是否在时间范围的边界上 + if (false == isIn && includeBegin) { + isIn = thisMills == rangeMin; + } + + if (false == isIn && includeEnd) { + isIn = thisMills == rangeMax; + } + + return isIn; } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java index 2471f1d7d..c737af574 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java @@ -181,11 +181,49 @@ public class TemporalAccessorUtil extends TemporalUtil{ * @param endDate 结束日期(包含) * @return 是否在范围内 */ - public static boolean isIn(TemporalAccessor date, TemporalAccessor beginDate, TemporalAccessor endDate){ - final long thisMills = TemporalAccessorUtil.toEpochMilli(date); - final long beginMills = TemporalAccessorUtil.toEpochMilli(beginDate); - final long endMills = TemporalAccessorUtil.toEpochMilli(endDate); + public static boolean isIn(final TemporalAccessor date, final TemporalAccessor beginDate, final TemporalAccessor endDate){ + return isIn(date, beginDate, endDate, true, true); + } - return thisMills >= Math.min(beginMills, endMills) && thisMills <= Math.max(beginMills, endMills); + /** + * 当前日期是否在日期指定范围内
+ * 起始日期和结束日期可以互换
+ * 通过includeBegin, includeEnd参数控制日期范围区间是否为开区间,例如:传入参数:includeBegin=true, includeEnd=false, + * 则本方法会判断 date ∈ (beginDate, endDate] 是否成立 + * + * @param date 被检查的日期 + * @param beginDate 起始日期 + * @param endDate 结束日期 + * @param includeBegin 时间范围是否包含起始日期 + * @param includeEnd 时间范围是否包含结束日期 + * @return 是否在范围内 + * @author FengBaoheng + * @since 5.8.6 + */ + public static boolean isIn(final TemporalAccessor date, final TemporalAccessor beginDate, final TemporalAccessor endDate, + final boolean includeBegin, final boolean includeEnd) { + if (date == null || beginDate == null || endDate == null) { + throw new IllegalArgumentException("参数不可为null"); + } + + final long thisMills = toEpochMilli(date); + final long beginMills = toEpochMilli(beginDate); + final long endMills = toEpochMilli(endDate); + final long rangeMin = Math.min(beginMills, endMills); + final long rangeMax = Math.max(beginMills, endMills); + + // 先判断是否满足 date ∈ (beginDate, endDate) + boolean isIn = rangeMin < thisMills && thisMills < rangeMax; + + // 若不满足,则再判断是否在时间范围的边界上 + if (false == isIn && includeBegin) { + isIn = thisMills == rangeMin; + } + + if (false == isIn && includeEnd) { + isIn = thisMills == rangeMax; + } + + return isIn; } } diff --git a/hutool-core/src/test/java/cn/hutool/core/date/TimeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/TimeUtilTest.java index f830c52c5..1879afb6f 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/TimeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/TimeUtilTest.java @@ -10,7 +10,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; -import java.time.temporal.TemporalAccessor; import java.util.Objects; public class TimeUtilTest { @@ -234,7 +233,49 @@ public class TimeUtilTest { @Test public void ofTest2(){ final Instant instant = Objects.requireNonNull(DateUtil.parse("2022-02-22")).toInstant(); - final LocalDateTime of = TimeUtil.of((TemporalAccessor) instant); + final LocalDateTime of = TimeUtil.of(instant); Console.log(of); } + + @SuppressWarnings("ConstantConditions") + @Test + public void isInTest() { + // 时间范围 8点-9点 + final LocalDateTime begin = LocalDateTime.parse("2019-02-02T08:00:00"); + final LocalDateTime end = LocalDateTime.parse("2019-02-02T09:00:00"); + + // 不在时间范围内 用例 + Assert.assertFalse(TimeUtil.isIn(LocalDateTime.parse("2019-02-02T06:00:00"), begin, end)); + Assert.assertFalse(TimeUtil.isIn(LocalDateTime.parse("2019-02-02T13:00:00"), begin, end)); + Assert.assertFalse(TimeUtil.isIn(LocalDateTime.parse("2019-02-01T08:00:00"), begin, end)); + Assert.assertFalse(TimeUtil.isIn(LocalDateTime.parse("2019-02-03T09:00:00"), begin, end)); + + // 在时间范围内 用例 + Assert.assertTrue(TimeUtil.isIn(LocalDateTime.parse("2019-02-02T08:00:00"), begin, end)); + Assert.assertTrue(TimeUtil.isIn(LocalDateTime.parse("2019-02-02T08:00:01"), begin, end)); + Assert.assertTrue(TimeUtil.isIn(LocalDateTime.parse("2019-02-02T08:11:00"), begin, end)); + Assert.assertTrue(TimeUtil.isIn(LocalDateTime.parse("2019-02-02T08:22:00"), begin, end)); + Assert.assertTrue(TimeUtil.isIn(LocalDateTime.parse("2019-02-02T08:59:59"), begin, end)); + Assert.assertTrue(TimeUtil.isIn(LocalDateTime.parse("2019-02-02T09:00:00"), begin, end)); + + // 测试边界条件 + Assert.assertTrue(TimeUtil.isIn(begin, begin, end, true, false)); + Assert.assertFalse(TimeUtil.isIn(begin, begin, end, false, false)); + Assert.assertTrue(TimeUtil.isIn(end, begin, end, false, true)); + Assert.assertFalse(TimeUtil.isIn(end, begin, end, false, false)); + + // begin、end互换 + Assert.assertTrue(TimeUtil.isIn(begin, end, begin, true, true)); + + // 比较当前时间范围 + final LocalDateTime now = LocalDateTime.now(); + Assert.assertTrue(TimeUtil.isIn(now, now.minusHours(1L), now.plusHours(1L))); + Assert.assertFalse(TimeUtil.isIn(now, now.minusHours(1L), now.minusHours(2L))); + Assert.assertFalse(TimeUtil.isIn(now, now.plusHours(1L), now.plusHours(2L))); + + // 异常入参 + Assert.assertThrows(IllegalArgumentException.class, () -> TimeUtil.isIn(null, begin, end, false, false)); + Assert.assertThrows(IllegalArgumentException.class, () -> TimeUtil.isIn(begin, null, end, false, false)); + Assert.assertThrows(IllegalArgumentException.class, () -> TimeUtil.isIn(begin, begin, null, false, false)); + } }