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 144898155..ca8a347ce 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,8 +1,11 @@ package cn.hutool.core.date; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ArrayUtil; +import java.time.format.TextStyle; import java.util.Calendar; +import java.util.Locale; /** * 月份枚举
@@ -78,7 +81,11 @@ public enum Month { UNDECIMBER(Calendar.UNDECIMBER); // --------------------------------------------------------------- - private static final int[] DAYS_OF_MONTH = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}; + /** + * Months aliases. + */ + private static final String[] ALIASES = {"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"}; + private static final Month[] ENUMS = Month.values(); /** * 对应值,见{@link Calendar} @@ -123,13 +130,24 @@ public enum Month { * @return 此月份最后一天的值 */ public int getLastDay(boolean isLeapYear) { - return getLastDay(this.value, isLeapYear); + switch (this) { + case FEBRUARY: + return isLeapYear ? 29 : 28; + case APRIL: + case JUNE: + case SEPTEMBER: + case NOVEMBER: + return 30; + default: + return 31; + } } /** * 将 {@link Calendar}月份相关值转换为Month枚举对象
+ * 未找到返回{@code null} * - * @param calendarMonthIntValue Calendar中关于Month的int值 + * @param calendarMonthIntValue Calendar中关于Month的int值,从0开始 * @return Month * @see Calendar#JANUARY * @see Calendar#FEBRUARY @@ -146,36 +164,26 @@ public enum Month { * @see Calendar#UNDECIMBER */ public static Month of(int calendarMonthIntValue) { - switch (calendarMonthIntValue) { - case Calendar.JANUARY: - return JANUARY; - case Calendar.FEBRUARY: - return FEBRUARY; - case Calendar.MARCH: - return MARCH; - case Calendar.APRIL: - return APRIL; - case Calendar.MAY: - return MAY; - case Calendar.JUNE: - return JUNE; - case Calendar.JULY: - return JULY; - case Calendar.AUGUST: - return AUGUST; - case Calendar.SEPTEMBER: - return SEPTEMBER; - case Calendar.OCTOBER: - return OCTOBER; - case Calendar.NOVEMBER: - return NOVEMBER; - case Calendar.DECEMBER: - return DECEMBER; - case Calendar.UNDECIMBER: - return UNDECIMBER; - default: - return null; + if (calendarMonthIntValue >= ENUMS.length || calendarMonthIntValue < 0) { + return null; } + return ENUMS[calendarMonthIntValue]; + } + + /** + * 解析别名为Month对象,别名如:jan或者JANUARY,不区分大小写 + * + * @param name 别名值 + * @return 月份int值 + * @throws IllegalArgumentException 如果别名无对应的枚举,抛出此异常 + * @since 5.8.0 + */ + public static Month of(String name) throws IllegalArgumentException { + Month of = of(ArrayUtil.indexOfIgnoreCase(ALIASES, name)); + if (null == of) { + of = Month.valueOf(name.toUpperCase()); + } + return of; } /** @@ -187,12 +195,9 @@ public enum Month { * @since 5.4.7 */ public static int getLastDay(int month, boolean isLeapYear) { - int lastDay = DAYS_OF_MONTH[month]; - if (isLeapYear && Calendar.FEBRUARY == month) { - // 二月 - lastDay += 1; - } - return lastDay; + final Month of = of(month); + Assert.notNull(of, "Invalid Month base 0: " + month); + return of.getLastDay(isLeapYear); } /** @@ -204,4 +209,27 @@ public enum Month { public java.time.Month toJdkMonth() { return java.time.Month.of(getValueBaseOne()); } + + /** + * 获取显示名称 + * + * @param style 名称风格 + * @return 显示名称 + * @since 5.8.0 + */ + public String getDisplayName(TextStyle style) { + return getDisplayName(style, Locale.getDefault()); + } + + /** + * 获取显示名称 + * + * @param style 名称风格 + * @param locale {@link Locale} + * @return 显示名称 + * @since 5.8.0 + */ + public String getDisplayName(TextStyle style, Locale locale) { + return toJdkMonth().getDisplayName(style, locale); + } } 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 7a7929f39..6f8d4f8fd 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 @@ -48,4 +48,19 @@ public class MonthTest { public void toJdkMonthTest2(){ Month.UNDECIMBER.toJdkMonth(); } + + @Test + public void ofTest(){ + Month jan = Month.of("Jan"); + Assert.assertEquals(Month.JANUARY, jan); + + jan = Month.of("JAN"); + Assert.assertEquals(Month.JANUARY, jan); + + jan = Month.of("FEBRUARY"); + Assert.assertEquals(Month.FEBRUARY, jan); + + jan = Month.of("February"); + Assert.assertEquals(Month.FEBRUARY, jan); + } } diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/MonthValueParser.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/MonthValueParser.java index fcc7daee5..089afed63 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/MonthValueParser.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/parser/MonthValueParser.java @@ -1,5 +1,7 @@ package cn.hutool.cron.pattern.parser; +import cn.hutool.core.date.Month; +import cn.hutool.core.lang.Assert; import cn.hutool.cron.CronException; /** @@ -10,11 +12,6 @@ import cn.hutool.cron.CronException; */ public class MonthValueParser extends AbsValueParser { - /** - * Months aliases. - */ - private static final String[] ALIASES = {"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"}; - public MonthValueParser() { super(1, 12); } @@ -31,16 +28,13 @@ public class MonthValueParser extends AbsValueParser { /** * 解析别名 * - * @param value 别名值 - * @return 月份int值 + * @param monthName 别名值 + * @return 月份int值,从1开始 * @throws CronException 无效月别名抛出此异常 */ - private int parseAlias(String value) throws CronException { - for (int i = 0; i < ALIASES.length; i++) { - if (ALIASES[i].equalsIgnoreCase(value)) { - return i + 1; - } - } - throw new CronException("Invalid month alias: {}", value); + private int parseAlias(String monthName) throws CronException { + final Month month = Month.of(monthName); + Assert.notNull(month, () -> new CronException("Invalid month alias: {}", monthName)); + return month.getValueBaseOne(); } }