forked from plusone/plusone-commons
添加 YearQuarter 和 Quarter 表示季度;修改 DateTimeTools。
parent
71b3b193d1
commit
c58e799b1e
|
@ -0,0 +1,128 @@
|
|||
package xyz.zhouxy.plusone.commons.base;
|
||||
|
||||
import java.time.Month;
|
||||
import java.time.MonthDay;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
|
||||
import xyz.zhouxy.plusone.commons.util.Numbers;
|
||||
|
||||
public enum Quarter {
|
||||
Q1(1, "Q1"),
|
||||
Q2(2, "Q2"),
|
||||
Q3(3, "Q3"),
|
||||
Q4(4, "Q4"),
|
||||
;
|
||||
|
||||
private final int value;
|
||||
private final String displayName;
|
||||
|
||||
private final int startMonthValue;
|
||||
private final MonthDay startMonthDay;
|
||||
|
||||
private final int lastMonthValue;
|
||||
private final MonthDay lastMonthDay;
|
||||
|
||||
Quarter(int value, String str) {
|
||||
this.value = value;
|
||||
this.displayName = str;
|
||||
|
||||
final int lastMonth = value * 3;
|
||||
final int startMonth = lastMonth - 2;
|
||||
|
||||
this.startMonthValue = startMonth;
|
||||
this.startMonthDay = MonthDay.of(startMonth, 1);
|
||||
this.lastMonthValue = lastMonth;
|
||||
this.lastMonthDay = MonthDay.of(lastMonth, (value == 1 || value == 4) ? 31 : 30);
|
||||
}
|
||||
|
||||
public static Quarter fromMonth(int monthValue) {
|
||||
Preconditions.checkArgument(Numbers.between(monthValue, 1, 13), "Invalid value for MonthOfYear: " + monthValue);
|
||||
return of(computeQuarterValueInternal(monthValue));
|
||||
}
|
||||
|
||||
public static Quarter fromMonth(Month month) {
|
||||
final int monthValue = month.getValue();
|
||||
return of(computeQuarterValueInternal(monthValue));
|
||||
}
|
||||
|
||||
public final YearQuarter atYear(int year) {
|
||||
return YearQuarter.of(year, this);
|
||||
}
|
||||
|
||||
public static Quarter of(int value) {
|
||||
switch (value) {
|
||||
case 1:
|
||||
return Q1;
|
||||
case 2:
|
||||
return Q2;
|
||||
case 3:
|
||||
return Q3;
|
||||
case 4:
|
||||
return Q4;
|
||||
default:
|
||||
throw new EnumConstantNotPresentException(Quarter.class, Integer.toString(value));
|
||||
}
|
||||
}
|
||||
|
||||
public static Quarter of(String str) {
|
||||
switch (str) {
|
||||
case "Q1":
|
||||
return Q1;
|
||||
case "Q2":
|
||||
return Q2;
|
||||
case "Q3":
|
||||
return Q3;
|
||||
case "Q4":
|
||||
return Q4;
|
||||
default:
|
||||
throw new EnumConstantNotPresentException(Quarter.class, str);
|
||||
}
|
||||
}
|
||||
|
||||
// Getters
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public Month getStartMonth() {
|
||||
return Month.of(startMonthValue);
|
||||
}
|
||||
|
||||
public int getStartMonthValue() {
|
||||
return startMonthValue;
|
||||
}
|
||||
|
||||
public Month getLastMonth() {
|
||||
return Month.of(lastMonthValue);
|
||||
}
|
||||
|
||||
public int getLastMonthValue() {
|
||||
return lastMonthValue;
|
||||
}
|
||||
|
||||
public MonthDay getStartMonthDay() {
|
||||
return startMonthDay;
|
||||
}
|
||||
|
||||
public MonthDay getLastMonthDay() {
|
||||
return lastMonthDay;
|
||||
}
|
||||
|
||||
// Getters end
|
||||
|
||||
/**
|
||||
* 计算季度
|
||||
*
|
||||
* @param monthValue 1~12
|
||||
* @return 季度。1~4
|
||||
*/
|
||||
private static int computeQuarterValueInternal(int monthValue) {
|
||||
return (monthValue - 1) / 3 + 1;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
package xyz.zhouxy.plusone.commons.base;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.Month;
|
||||
import java.time.YearMonth;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
|
||||
public final class YearQuarter {
|
||||
private final int year;
|
||||
private final Quarter quarter;
|
||||
private final LocalDate startDate;
|
||||
private final LocalDate lastDate;
|
||||
|
||||
private YearQuarter(int year, Quarter quarter) {
|
||||
Preconditions.checkNotNull(quarter, "Quarter can not be null.");
|
||||
this.year = year;
|
||||
this.quarter = quarter;
|
||||
this.startDate = quarter.getStartMonthDay().atYear(year);
|
||||
this.lastDate = quarter.getLastMonthDay().atYear(year);
|
||||
}
|
||||
|
||||
public static YearQuarter of(int year, Quarter quarter) {
|
||||
return new YearQuarter(year, quarter);
|
||||
}
|
||||
|
||||
public static YearQuarter of(LocalDate date) {
|
||||
return new YearQuarter(date.getYear(), Quarter.fromMonth(date.getMonth()));
|
||||
}
|
||||
|
||||
public static YearQuarter of(Date date) {
|
||||
@SuppressWarnings("deprecation")
|
||||
final int year = date.getYear() + 1900;
|
||||
@SuppressWarnings("deprecation")
|
||||
final int month = date.getMonth() + 1;
|
||||
return of(year, Quarter.fromMonth(month));
|
||||
}
|
||||
|
||||
public static YearQuarter of(Calendar date) {
|
||||
return of(date.get(Calendar.YEAR), Quarter.fromMonth(date.get(Calendar.MONTH) + 1));
|
||||
}
|
||||
|
||||
public static YearQuarter of(YearMonth yearMonth) {
|
||||
return of(yearMonth.getYear(), Quarter.fromMonth(yearMonth.getMonth()));
|
||||
}
|
||||
|
||||
public int getYear() {
|
||||
return year;
|
||||
}
|
||||
|
||||
public Quarter getQuarter() {
|
||||
return quarter;
|
||||
}
|
||||
|
||||
public Month getStartMonth() {
|
||||
return this.quarter.getStartMonth();
|
||||
}
|
||||
|
||||
public int getStartMonthValue() {
|
||||
return this.quarter.getStartMonthValue();
|
||||
}
|
||||
|
||||
public Month getLastMonth() {
|
||||
return this.quarter.getLastMonth();
|
||||
}
|
||||
|
||||
public int getLastMonthValue() {
|
||||
return this.quarter.getLastMonthValue();
|
||||
}
|
||||
|
||||
public LocalDate getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public LocalDate getLastDate() {
|
||||
return lastDate;
|
||||
}
|
||||
}
|
|
@ -17,7 +17,8 @@ import org.apache.commons.lang3.StringUtils;
|
|||
import com.google.common.base.Preconditions;
|
||||
|
||||
import xyz.zhouxy.plusone.commons.collection.SafeConcurrentHashMap;
|
||||
|
||||
import xyz.zhouxy.plusone.commons.base.Quarter;
|
||||
import xyz.zhouxy.plusone.commons.base.YearQuarter;
|
||||
import xyz.zhouxy.plusone.commons.collection.MapWrapper;
|
||||
|
||||
public class DateTimeTools {
|
||||
|
@ -158,6 +159,10 @@ public class DateTimeTools {
|
|||
return ZonedDateTime.ofInstant(dateTime.toInstant(), timeZone.toZoneId());
|
||||
}
|
||||
|
||||
public static ZonedDateTime toZonedDateTime(Calendar calendar) {
|
||||
return calendar.toInstant().atZone(calendar.getTimeZone().toZoneId());
|
||||
}
|
||||
|
||||
public static ZonedDateTime toZonedDateTime(Calendar calendar, ZoneId zone) {
|
||||
return calendar.toInstant().atZone(zone);
|
||||
}
|
||||
|
@ -327,30 +332,20 @@ public class DateTimeTools {
|
|||
|
||||
// getQuarter
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static int getQuarter(Date date) {
|
||||
return getQuarterInternal(date.getMonth() + 1);
|
||||
public static YearQuarter getQuarter(Date date) {
|
||||
return YearQuarter.of(date);
|
||||
}
|
||||
|
||||
public static int getQuarter(Calendar date) {
|
||||
return getQuarterInternal(date.get(Calendar.MONTH) + 1);
|
||||
public static YearQuarter getQuarter(Calendar date) {
|
||||
return YearQuarter.of(date);
|
||||
}
|
||||
|
||||
public static int getQuarter(Month month) {
|
||||
return getQuarterInternal(month.getValue());
|
||||
public static Quarter getQuarter(Month month) {
|
||||
return Quarter.fromMonth(month);
|
||||
}
|
||||
|
||||
public static int getQuarter(LocalDate date) {
|
||||
return getQuarterInternal(date.getMonthValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取季度
|
||||
* @param monthValue 1~12
|
||||
* @return 季度。1~4
|
||||
*/
|
||||
private static int getQuarterInternal(int monthValue) {
|
||||
return (monthValue - 1) / 3 + 1;
|
||||
public static YearQuarter getQuarter(LocalDate date) {
|
||||
return YearQuarter.of(date);
|
||||
}
|
||||
|
||||
private DateTimeTools() {
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
package xyz.zhouxy.plusone.commons.util;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.slf4j.Logger;
|
||||
|
@ -14,38 +17,56 @@ class DateTimeToolsTests {
|
|||
|
||||
@Test
|
||||
void testLocalNowStr() {
|
||||
log.info(DateTimeTools.nowStr("yyyy/MM/dd HH:mm:ss.SSS"));
|
||||
String nowStr = DateTimeTools.nowStr("yyyy/MM/dd HH:mm:ss.SSS");
|
||||
log.info(nowStr);
|
||||
assertEquals(23, nowStr.length());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testToJoda() {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
log.info("now: {}", now);
|
||||
org.joda.time.LocalDateTime now2 = DateTimeTools.toJodaLocalDateTime(now);
|
||||
log.info("now2: {}", now2);
|
||||
LocalDateTime dt = LocalDateTime.of(2008, 8, 8, 20, 18, 59, 108000000);
|
||||
log.info("src: {}", dt);
|
||||
org.joda.time.LocalDateTime dt2 = DateTimeTools.toJodaLocalDateTime(dt);
|
||||
log.info("result: {}", dt2);
|
||||
org.joda.time.format.DateTimeFormatter f = org.joda.time.format.DateTimeFormat
|
||||
.forPattern("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
|
||||
assertEquals("2008-08-08 20:18:59.108", f.print(dt2));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testToInstant() {
|
||||
Instant now = DateTimeTools.toInstant(System.currentTimeMillis());
|
||||
String str = DateTimeTools.toString("yy-M-d HH:mm:ss.SSS", now);
|
||||
ZonedDateTime dt = ZonedDateTime.of(2008, 1, 8, 10, 23, 50, 108000000, ZoneId.systemDefault());
|
||||
Instant instant = DateTimeTools.toInstant(dt.toInstant().toEpochMilli());
|
||||
String str = DateTimeTools.toString("yy-M-d HH:mm:ss.SSS", instant);
|
||||
log.info(str);
|
||||
assertEquals("08-1-8 10:23:50.108", str);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testToJodaDateTime() {
|
||||
Instant now = Instant.now();
|
||||
org.joda.time.DateTime jodaDateTime = DateTimeTools.toJodaDateTime(now, ZoneId.of("+08:00"));
|
||||
ZonedDateTime dt = ZonedDateTime.of(2008, 1, 8, 10, 23, 50, 108000000, ZoneId.systemDefault());
|
||||
Instant instant = DateTimeTools.toInstant(dt.toInstant().toEpochMilli());
|
||||
|
||||
org.joda.time.format.DateTimeFormatter f = org.joda.time.format.DateTimeFormat
|
||||
.forPattern("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
|
||||
org.joda.time.DateTime jodaDateTime = DateTimeTools.toJodaDateTime(instant, ZoneId.of("+08:00"));
|
||||
log.info("jodaDateTime: {}", jodaDateTime);
|
||||
jodaDateTime = DateTimeTools.toJodaDateTime(now, ZoneId.of("+02:00"));
|
||||
assertEquals("2008-01-08 10:23:50.108", f.print(jodaDateTime));
|
||||
|
||||
|
||||
jodaDateTime = DateTimeTools.toJodaDateTime(instant, ZoneId.of("+02:00"));
|
||||
log.info("jodaDateTime: {}", jodaDateTime);
|
||||
assertEquals("2008-01-08 04:23:50.108", f.print(jodaDateTime));
|
||||
}
|
||||
|
||||
@Test
|
||||
void test() {
|
||||
java.time.Instant now = java.time.Instant.now();
|
||||
org.joda.time.DateTime jodaDateTime = DateTimeTools.toJodaDateTime(now, ZoneId.of("America/New_York"));
|
||||
org.joda.time.format.DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
org.joda.time.format.DateTimeFormatter formatter =
|
||||
org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
log.info(formatter.print(jodaDateTime));
|
||||
log.info(jodaDateTime.getZone().toString());
|
||||
log.info(jodaDateTime.toString());
|
||||
|
|
Loading…
Reference in New Issue