add methon

This commit is contained in:
Looly 2022-03-24 10:47:03 +08:00
parent 163dff00bd
commit eb0cc1a503
3 changed files with 89 additions and 52 deletions

View File

@ -1,8 +1,11 @@
package cn.hutool.core.date; package cn.hutool.core.date;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import java.time.format.TextStyle;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale;
/** /**
* 月份枚举<br> * 月份枚举<br>
@ -78,7 +81,11 @@ public enum Month {
UNDECIMBER(Calendar.UNDECIMBER); 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} * 对应值{@link Calendar}
@ -123,13 +130,24 @@ public enum Month {
* @return 此月份最后一天的值 * @return 此月份最后一天的值
*/ */
public int getLastDay(boolean isLeapYear) { 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枚举对象<br> * {@link Calendar}月份相关值转换为Month枚举对象<br>
* 未找到返回{@code null}
* *
* @param calendarMonthIntValue Calendar中关于Month的int值 * @param calendarMonthIntValue Calendar中关于Month的int值从0开始
* @return Month * @return Month
* @see Calendar#JANUARY * @see Calendar#JANUARY
* @see Calendar#FEBRUARY * @see Calendar#FEBRUARY
@ -146,36 +164,26 @@ public enum Month {
* @see Calendar#UNDECIMBER * @see Calendar#UNDECIMBER
*/ */
public static Month of(int calendarMonthIntValue) { public static Month of(int calendarMonthIntValue) {
switch (calendarMonthIntValue) { if (calendarMonthIntValue >= ENUMS.length || calendarMonthIntValue < 0) {
case Calendar.JANUARY: return null;
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;
} }
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 * @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]; final Month of = of(month);
if (isLeapYear && Calendar.FEBRUARY == month) { Assert.notNull(of, "Invalid Month base 0: " + month);
// 二月 return of.getLastDay(isLeapYear);
lastDay += 1;
}
return lastDay;
} }
/** /**
@ -204,4 +209,27 @@ public enum Month {
public java.time.Month toJdkMonth() { public java.time.Month toJdkMonth() {
return java.time.Month.of(getValueBaseOne()); 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);
}
} }

View File

@ -48,4 +48,19 @@ public class MonthTest {
public void toJdkMonthTest2(){ public void toJdkMonthTest2(){
Month.UNDECIMBER.toJdkMonth(); 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);
}
} }

View File

@ -1,5 +1,7 @@
package cn.hutool.cron.pattern.parser; package cn.hutool.cron.pattern.parser;
import cn.hutool.core.date.Month;
import cn.hutool.core.lang.Assert;
import cn.hutool.cron.CronException; import cn.hutool.cron.CronException;
/** /**
@ -10,11 +12,6 @@ import cn.hutool.cron.CronException;
*/ */
public class MonthValueParser extends AbsValueParser { 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() { public MonthValueParser() {
super(1, 12); super(1, 12);
} }
@ -31,16 +28,13 @@ public class MonthValueParser extends AbsValueParser {
/** /**
* 解析别名 * 解析别名
* *
* @param value 别名值 * @param monthName 别名值
* @return 月份int值 * @return 月份int值从1开始
* @throws CronException 无效月别名抛出此异常 * @throws CronException 无效月别名抛出此异常
*/ */
private int parseAlias(String value) throws CronException { private int parseAlias(String monthName) throws CronException {
for (int i = 0; i < ALIASES.length; i++) { final Month month = Month.of(monthName);
if (ALIASES[i].equalsIgnoreCase(value)) { Assert.notNull(month, () -> new CronException("Invalid month alias: {}", monthName));
return i + 1; return month.getValueBaseOne();
}
}
throw new CronException("Invalid month alias: {}", value);
} }
} }