diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateBetween.java b/hutool-core/src/main/java/cn/hutool/core/date/DateBetween.java index 60e7007328..db0273189a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateBetween.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateBetween.java @@ -74,13 +74,17 @@ public class DateBetween implements Serializable { Assert.notNull(begin, "Begin date is null !"); Assert.notNull(end, "End date is null !"); + // defensive copy + Date b = new Date(begin.getTime()); + Date e = new Date(end.getTime()); + if (isAbs && begin.after(end)) { // 间隔只为正数的情况下,如果开始日期晚于结束日期,置换之 - this.begin = end; - this.end = begin; + this.begin = e; + this.end = b; } else { - this.begin = begin; - this.end = end; + this.begin = b; + this.end = e; } } diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateBetweenTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateBetweenTest.java index 86e723b2b0..3e5ff29282 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateBetweenTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateBetweenTest.java @@ -96,4 +96,17 @@ public class DateBetweenTest { long result = DateUtil.betweenYear(sdate, edate, false); assertEquals(0, result); } + + @Test + public void issueIDFVKGTest() { + Date b = new Date(1609459200000L); // 2021-01-01 00:00:00 + Date e = new Date(1609545600000L); // 2021-01-02 00:00:00 + DateBetween db = new DateBetween(b, e); + + // 修改原始 date + b.setTime(0L); // 1970-01-01 + + // 期望 DateBetween 不受影响,间隔仍为 1 天 + assertEquals(1, db.between(DateUnit.DAY)); + } }