diff --git a/CHANGELOG.md b/CHANGELOG.md index 22af4cfc9..e53326887 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ * 【extra 】 EmojiUtil增加方法(pr#519@Gitee) * 【core 】 DateUtil 添加两个日期是否同一周方法(pr#516@Gitee) * 【db 】 新增条件组,用于处理复杂的where条件(pr#514@Gitee) +* 【core 】 新增LocalDateTimeUtil.weekOfYear(issue#I4RWXC@Gitee) +* 【core 】 Month增加toJdkMonth、getValueBaseOne ### 🐞Bug修复 * 【core 】 修复ChineseDate农历获取正月出现数组越界BUG(issue#2112@Github) 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 102fdff4e..b065c4ed1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java @@ -22,6 +22,7 @@ import java.time.temporal.ChronoUnit; import java.time.temporal.Temporal; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalUnit; +import java.time.temporal.WeekFields; import java.util.Date; import java.util.TimeZone; @@ -562,4 +563,21 @@ public class LocalDateTimeUtil { return startTime.isAfter(realEndTime) || endTime.isBefore(realStartTime); } + /** + * 获得指定日期是所在年份的第几周,如: + * + * + * + * @param date 日期({@link LocalDate} 或者 {@link LocalDateTime}等) + * @return 所在年的第几周 + * @since 5.7.21 + */ + public static int weekOfYear(TemporalAccessor date){ + return TemporalAccessorUtil.get(date, WeekFields.ISO.weekOfYear()); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/date/Month.java b/hutool-core/src/main/java/cn/hutool/core/date/Month.java index 0d82a6b5e..144898155 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/Month.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/Month.java @@ -1,5 +1,7 @@ package cn.hutool.core.date; +import cn.hutool.core.lang.Assert; + import java.util.Calendar; /** @@ -93,14 +95,27 @@ public enum Month { } /** - * 获取{@link Calendar}中的对应值 + * 获取{@link Calendar}中的对应值
+ * 此值从0开始,即0表示一月 * - * @return {@link Calendar}中的对应值 + * @return {@link Calendar}中的对应月份值,从0开始计数 */ public int getValue() { return this.value; } + /** + * 获取月份值,此值与{@link java.time.Month}对应
+ * 此值从1开始,即1表示一月 + * + * @return 月份值,对应{@link java.time.Month},从1开始计数 + * @since 5.7.21 + */ + public int getValueBaseOne() { + Assert.isFalse(this == UNDECIMBER, "Unsupported UNDECIMBER Field"); + return getValue() + 1; + } + /** * 获取此月份最后一天的值,不支持的月份(例如UNDECIMBER)返回-1 * @@ -165,17 +180,28 @@ public enum Month { /** * 获得指定月的最后一天 - * @param month 月份,从0开始 + * + * @param month 月份,从0开始 * @param isLeapYear 是否为闰年,闰年只对二月有影响 * @return 最后一天,可能为28,29,30,31 * @since 5.4.7 */ - public static int getLastDay(int month, boolean isLeapYear){ + public static int getLastDay(int month, boolean isLeapYear) { int lastDay = DAYS_OF_MONTH[month]; - if (isLeapYear && Calendar.FEBRUARY == month){ + if (isLeapYear && Calendar.FEBRUARY == month) { // 二月 lastDay += 1; } return lastDay; } + + /** + * 转换为{@link java.time.Month} + * + * @return {@link java.time.Month} + * @since 5.7.21 + */ + public java.time.Month toJdkMonth() { + return java.time.Month.of(getValueBaseOne()); + } } 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 8f35c59a5..dd1ec960a 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java @@ -197,4 +197,24 @@ public class LocalDateTimeUtilTest { Assert.assertTrue(LocalDateTimeUtil.isOverlap(oneStartTime2,oneEndTime2,realStartTime,realEndTime)); Assert.assertFalse(LocalDateTimeUtil.isOverlap(oneStartTime3,oneEndTime3,realStartTime,realEndTime)); } + + @Test + public void weekOfYearTest(){ + LocalDate date1 = LocalDate.of(2021, 12, 31); + final int weekOfYear1 = LocalDateTimeUtil.weekOfYear(date1); + Assert.assertEquals(weekOfYear1, 52); + + final int weekOfYear2 = LocalDateTimeUtil.weekOfYear(date1.atStartOfDay()); + Assert.assertEquals(weekOfYear2, 52); + } + + @Test + public void weekOfYearTest2(){ + LocalDate date1 = LocalDate.of(2022, 1, 31); + final int weekOfYear1 = LocalDateTimeUtil.weekOfYear(date1); + Assert.assertEquals(weekOfYear1, 52); + + final int weekOfYear2 = LocalDateTimeUtil.weekOfYear(date1.atStartOfDay()); + Assert.assertEquals(weekOfYear2, 52); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/date/MonthTest.java b/hutool-core/src/test/java/cn/hutool/core/date/MonthTest.java index dce94bb09..7a7929f39 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/MonthTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/MonthTest.java @@ -37,4 +37,15 @@ public class MonthTest { lastDay = Month.of(Calendar.DECEMBER).getLastDay(true); Assert.assertEquals(31, lastDay); } + + @Test + public void toJdkMonthTest(){ + final java.time.Month month = Month.AUGUST.toJdkMonth(); + Assert.assertEquals(java.time.Month.AUGUST, month); + } + + @Test(expected = IllegalArgumentException.class) + public void toJdkMonthTest2(){ + Month.UNDECIMBER.toJdkMonth(); + } }