添加计算方法。

dev
ZhouXY108 2024-08-28 17:20:54 +08:00
parent 6d76e9d524
commit 707712b2c0
3 changed files with 63 additions and 1 deletions

View File

@ -5,6 +5,7 @@ import java.time.MonthDay;
import com.google.common.base.Preconditions;
import xyz.zhouxy.plusone.commons.annotation.StaticFactoryMethod;
import xyz.zhouxy.plusone.commons.util.Numbers;
/**
@ -45,6 +46,8 @@ public enum Quarter {
this.firstMonth = this.lastMonth - 2;
}
// StaticFactoryMethods
/**
*
*
@ -52,6 +55,7 @@ public enum Quarter {
* @return
* @throws IllegalArgumentException 112
*/
@StaticFactoryMethod(Quarter.class)
public static Quarter fromMonth(int monthValue) {
Preconditions.checkArgument(Numbers.between(monthValue, 1, 13), "Invalid value for MonthOfYear: " + monthValue);
return of(computeQuarterValueInternal(monthValue));
@ -63,6 +67,7 @@ public enum Quarter {
* @param month
* @return
*/
@StaticFactoryMethod(Quarter.class)
public static Quarter fromMonth(Month month) {
final int monthValue = month.getValue();
return of(computeQuarterValueInternal(monthValue));
@ -86,6 +91,7 @@ public enum Quarter {
* @return
* @throws IllegalArgumentException 14
*/
@StaticFactoryMethod(Quarter.class)
public static Quarter of(int value) {
if (value < 1 || value > 4) {
throw new IllegalArgumentException("Invalid value for Quarter: " + value);
@ -93,6 +99,21 @@ public enum Quarter {
return ENUMS[value - 1];
}
// StaticFactoryMethods end
// computs
public Quarter plus(long quarters) { // TODO 单元测试
final int amount = (int) ((quarters % 4) + 4);
return ENUMS[(ordinal() + amount) % 4];
}
public Quarter minus(long quarters) { // TODO 单元测试
return plus(-(quarters % 4));
}
// computs end
// Getters
public int getValue() {

View File

@ -1,5 +1,7 @@
package xyz.zhouxy.plusone.commons.time;
import static java.time.temporal.ChronoField.YEAR;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.Month;
@ -29,6 +31,14 @@ public final class YearQuarter implements Comparable<YearQuarter>, Serializable
/** 季度结束日期 */
private final LocalDate lastDate;
private YearQuarter(int year, int quarter) {
Preconditions.checkNotNull(quarter, "Quarter can not be null.");
this.year = year;
this.quarter = Quarter.of(quarter);
this.firstDate = this.quarter.firstMonthDay().atYear(year);
this.lastDate = this.quarter.lastMonthDay().atYear(year);
}
private YearQuarter(int year, @Nonnull Quarter quarter) {
Preconditions.checkNotNull(quarter, "Quarter can not be null.");
this.year = year;
@ -136,6 +146,37 @@ public final class YearQuarter implements Comparable<YearQuarter>, Serializable
// Getters end
// computes
public YearQuarter plusQuarters(long quartersToAdd) { // TODO 单元测试
if (quartersToAdd == 0) {
return this;
}
long quarterCount = this.year * 4L + (this.quarter.getValue() - 1);
long calcQuarters = quarterCount + quartersToAdd; // safe overflow
int newYear = YEAR.checkValidIntValue(Math.floorDiv(calcQuarters, 4));
int newQuarter = (int) Math.floorMod(calcQuarters, 4) + 1;
return of(newYear, Quarter.of(newQuarter));
}
public YearQuarter minusQuarters(long quartersToAdd) { // TODO 单元测试
return plusQuarters(-quartersToAdd);
}
public YearQuarter plusYears(long yearsToAdd) { // TODO 单元测试
if (yearsToAdd == 0) {
return this;
}
int newYear = YEAR.checkValidIntValue(this.year + yearsToAdd); // safe overflow
return of(newYear, this.quarter);
}
public YearQuarter minusYears(long yearsToAdd) {
return plusYears(-yearsToAdd);
}
// computes end
// hashCode & equals
@Override

View File

@ -203,7 +203,7 @@ class QuarterTests {
@Test
void testFirstDayOfYear() {
int firstDayOfYear;
firstDayOfYear = Quarter.Q1.firstDayOfYear(true);
assertEquals(1, firstDayOfYear);
firstDayOfYear = Quarter.Q1.firstDayOfYear(false);