From 784041ed35b38b58b5b425df3fe5593808151e99 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 31 Mar 2025 09:50:49 +0800 Subject: [PATCH] add methods --- .../org/dromara/hutool/core/date/Quarter.java | 56 ++++++++++++ .../dromara/hutool/core/date/QuarterTest.java | 86 +++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 hutool-core/src/test/java/org/dromara/hutool/core/date/QuarterTest.java diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/Quarter.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/Quarter.java index 74643ae5d..6788ae7a0 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/Quarter.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/Quarter.java @@ -16,6 +16,10 @@ package org.dromara.hutool.core.date; +import org.dromara.hutool.core.lang.Assert; + +import java.time.temporal.ChronoField; + /** * 季度枚举 * @@ -84,4 +88,56 @@ public enum Quarter { return null; } } + + /** + * 根据给定的月份值返回对应的季度 + * + * @param monthValue 月份值,取值范围为1到12 + * @return 对应的季度 + * @throws IllegalArgumentException 如果月份值不在有效范围内(1到12),将抛出异常 + */ + public static Quarter fromMonth(final int monthValue) { + ChronoField.MONTH_OF_YEAR.checkValidValue(monthValue); + return of(computeQuarterValueInternal(monthValue)); + } + + /** + * 根据给定的月份返回对应的季度 + * + * @param month 月份 + * @return 对应的季度 + */ + public static Quarter fromMonth(final Month month) { + Assert.notNull(month); + final int monthValue = month.getValue(); + return of(computeQuarterValueInternal(monthValue)); + } + + /** + * 该季度的第一个月 + * + * @return 结果 + */ + public Month firstMonth() { + return Month.of(value * 3 - 3); + } + + /** + * 该季度最后一个月 + * + * @return 结果 + */ + public Month lastMonth() { + return Month.of(value * 3 - 1); + } + + /** + * 计算给定月份对应的季度值 + * + * @param monthValue 月份值,取值范围为1到12 + * @return 对应的季度值 + */ + private static int computeQuarterValueInternal(final int monthValue) { + return (monthValue - 1) / 3 + 1; + } } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/date/QuarterTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/date/QuarterTest.java new file mode 100644 index 000000000..c02cc2a2a --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/date/QuarterTest.java @@ -0,0 +1,86 @@ +package org.dromara.hutool.core.date; + +import org.junit.jupiter.api.Test; + +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.*; + +public class QuarterTest { + @Test + void testQ1() { + final Quarter quarter = Quarter.of(1); + assertSame(Quarter.Q1, quarter); + assertSame(quarter, Quarter.valueOf("Q1")); + assertEquals(1, Objects.requireNonNull(quarter).getValue()); + assertEquals("Q1", quarter.name()); + + assertNull(Quarter.of(0)); + + final Month firstMonth = quarter.firstMonth(); + assertEquals(Month.JANUARY, firstMonth); + + final Month lastMonth = quarter.lastMonth(); + assertEquals(Month.MARCH, lastMonth); + } + + @Test + void testQ2() { + final Quarter quarter = Quarter.of(2); + assertSame(Quarter.Q2, quarter); + assertSame(quarter, Quarter.valueOf("Q2")); + assertEquals(2, Objects.requireNonNull(quarter).getValue()); + assertEquals("Q2", quarter.name()); + + assertNull(Quarter.of(5)); + + // ========== + + final Month firstMonth = quarter.firstMonth(); + assertEquals(Month.APRIL, firstMonth); + + // ========== + + final Month lastMonth = quarter.lastMonth(); + assertEquals(Month.JUNE, lastMonth); + } + + @Test + void testQ3() { + final Quarter quarter = Quarter.of(3); + assertSame(Quarter.Q3, quarter); + assertSame(quarter, Quarter.valueOf("Q3")); + assertEquals(3, Objects.requireNonNull(quarter).getValue()); + assertEquals("Q3", quarter.name()); + + assertThrows(IllegalArgumentException.class, () -> { + Quarter.valueOf("Abc"); + }); + + final Month firstMonth = quarter.firstMonth(); + assertEquals(Month.JULY, firstMonth); + + final Month lastMonth = quarter.lastMonth(); + assertEquals(Month.SEPTEMBER, lastMonth); + } + + @Test + void testQ4() { + final Quarter quarter = Quarter.of(4); + assertSame(Quarter.Q4, quarter); + assertSame(quarter, Quarter.valueOf("Q4")); + assertEquals(4, quarter.getValue()); + assertEquals("Q4", quarter.name()); + + assertThrows(IllegalArgumentException.class, () -> { + Quarter.valueOf("Q5"); + }); + + final Month firstMonth = quarter.firstMonth(); + assertEquals(Month.OCTOBER, firstMonth); + + final Month lastMonth = quarter.lastMonth(); + assertEquals(Month.DECEMBER, lastMonth); + } + +}