From 4a85b01b386ffd47bb6aaddbe086e45413751d62 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 23 Mar 2023 22:29:39 +0800 Subject: [PATCH] fix bug --- .../cn/hutool/core/date/CalendarUtil.java | 27 +++++++++++++------ .../cn/hutool/core/date/Issue3011Test.java | 23 ++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 hutool-core/src/test/java/cn/hutool/core/date/Issue3011Test.java diff --git a/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java index 6c042e540..7ade9f387 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/CalendarUtil.java @@ -358,6 +358,7 @@ public class CalendarUtil { } // endregion + // region ----- isSame /** * 比较两个日期是否为同一天 * @@ -366,12 +367,7 @@ public class CalendarUtil { * @return 是否为同一天 */ public static boolean isSameDay(final Calendar cal1, final Calendar cal2) { - if (cal1 == null || cal2 == null) { - throw new IllegalArgumentException("The date must not be null"); - } - return cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR) && // - cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && // - cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA); + return isSameYear(cal1, cal2) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR); } /** @@ -409,7 +405,8 @@ public class CalendarUtil { } /** - * 比较两个日期是否为同一月 + * 比较两个日期是否为同一月
+ * 同一个月的意思是:ERA(公元)、year(年)、month(月)都一致。 * * @param cal1 日期1 * @param cal2 日期2 @@ -417,11 +414,24 @@ public class CalendarUtil { * @since 5.4.1 */ public static boolean isSameMonth(final Calendar cal1, final Calendar cal2) { + return isSameYear(cal1, cal2) && cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH); + } + + /** + * 比较两个日期是否为同一年r> + * 同一个月的意思是:ERA(公元)、year(年)都一致。 + * + * @param cal1 日期1 + * @param cal2 日期2 + * @return 是否为同一年 + */ + public static boolean isSameYear(final Calendar cal1, final Calendar cal2) { if (cal1 == null || cal2 == null) { throw new IllegalArgumentException("The date must not be null"); } return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && // - cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH); + // issue#3011@Github + cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA); } /** @@ -444,6 +454,7 @@ public class CalendarUtil { return date1.getTimeInMillis() == date2.getTimeInMillis(); } + // endregion /** * 获得指定日期年份和季度
diff --git a/hutool-core/src/test/java/cn/hutool/core/date/Issue3011Test.java b/hutool-core/src/test/java/cn/hutool/core/date/Issue3011Test.java new file mode 100644 index 000000000..d28f81f76 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/date/Issue3011Test.java @@ -0,0 +1,23 @@ +package cn.hutool.core.date; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Calendar; + +public class Issue3011Test { + @Test + public void isSameMonthTest() { + // https://github.com/dromara/hutool/issues/3011 + // 判断是否同一个月,还需考虑公元前和公元后的的情况 + // 此处公元前2020年和公元2021年返回年都是2021 + final Calendar calendar1 = Calendar.getInstance(); + calendar1.set(-2020, Calendar.FEBRUARY, 12); + + final Calendar calendar2 = Calendar.getInstance(); + calendar2.set(2021, Calendar.FEBRUARY, 12); + + + Assert.assertFalse(DateUtil.isSameMonth(calendar1, calendar2)); + } +}