From c0811cc4c49de0131aa266fa3231e0102f4474ed Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 23 Feb 2022 01:22:56 +0800 Subject: [PATCH] fix code --- .../java/cn/hutool/core/date/ChineseDate.java | 26 +++++++++++-------- .../hutool/core/date/LocalDateTimeUtil.java | 4 +++ .../core/date/TemporalAccessorUtil.java | 5 ++-- .../hutool/core/date/chinese/LunarInfo.java | 4 ++- .../core/date/LocalDateTimeUtilTest.java | 10 +++++++ 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java b/hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java index ffdda37e4..16ef7f540 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/ChineseDate.java @@ -8,6 +8,7 @@ import cn.hutool.core.date.chinese.LunarInfo; import cn.hutool.core.date.chinese.SolarTerms; import cn.hutool.core.util.StrUtil; +import java.time.LocalDate; import java.util.Calendar; import java.util.Date; @@ -47,20 +48,23 @@ public class ChineseDate { * @param date 公历日期 */ public ChineseDate(Date date) { + this(LocalDateTimeUtil.ofDate(date.toInstant())); + } + + /** + * 通过公历日期构造 + * + * @param localDate 公历日期 + * @since 5.7.22 + */ + public ChineseDate(LocalDate localDate) { // 公历 - final DateTime dt = DateUtil.beginOfDay(date); - gyear = dt.year(); - gmonthBase1 = dt.monthBaseOne(); - gday = dt.dayOfMonth(); + gyear = localDate.getYear(); + gmonthBase1 = localDate.getMonthValue(); + gday = localDate.getDayOfMonth(); // 求出和1900年1月31日相差的天数 - final long time = dt.getTime(); - int offset = (int) ((time / DateUnit.DAY.getMillis()) - LunarInfo.BASE_DAY); - if(time > 0 && (time % DateUnit.DAY.getMillis()) > 0){ - // 在GMT+0800时区或非UTC时区,1970-01-02的时间戳小于一天的毫秒数,导致减法后为0,之后的农历总会少一天 - // 此处判断是否有余数,如果有则非UTC时间,此时将时间差算为一天。 - offset++; - } + int offset = (int) (localDate.toEpochDay() - LunarInfo.BASE_DAY); // 计算农历年份 // 用offset减去每农历年的天数,计算当天是农历第几天,offset是当年的第几天 diff --git a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java index b065c4ed1..7ca61929a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java @@ -182,6 +182,8 @@ public class LocalDateTimeUtil { if (temporalAccessor instanceof LocalDate) { return ((LocalDate) temporalAccessor).atStartOfDay(); + } else if(temporalAccessor instanceof Instant){ + return LocalDateTime.ofInstant((Instant) temporalAccessor, ZoneId.systemDefault()); } return LocalDateTime.of( @@ -209,6 +211,8 @@ public class LocalDateTimeUtil { if (temporalAccessor instanceof LocalDateTime) { return ((LocalDateTime) temporalAccessor).toLocalDate(); + } else if(temporalAccessor instanceof Instant){ + return of(temporalAccessor).toLocalDate(); } return LocalDate.of( diff --git a/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java index 034f4868b..067164e0d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/TemporalAccessorUtil.java @@ -26,11 +26,12 @@ import java.time.temporal.UnsupportedTemporalTypeException; public class TemporalAccessorUtil extends TemporalUtil{ /** - * 安全获取时间的某个属性,属性不存在返回0 + * 安全获取时间的某个属性,属性不存在返回最小值,一般为0
+ * 注意请谨慎使用此方法,某些{@link TemporalAccessor#isSupported(TemporalField)}为{@code false}的方法返回最小值 * * @param temporalAccessor 需要获取的时间对象 * @param field 需要获取的属性 - * @return 时间的值,如果无法获取则默认为 0 + * @return 时间的值,如果无法获取则获取最小值,一般为0 */ public static int get(TemporalAccessor temporalAccessor, TemporalField field) { if (temporalAccessor.isSupported(field)) { diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java index a4d72c14b..faf8fd692 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java @@ -1,5 +1,7 @@ package cn.hutool.core.date.chinese; +import java.time.LocalDate; + /** * 阴历(农历)信息 * @@ -15,7 +17,7 @@ public class LunarInfo { /** * 1900-01-31,农历正月初一 */ - public static final long BASE_DAY = -25537; + public static final long BASE_DAY = LocalDate.of(BASE_YEAR, 1, 31).toEpochDay(); /** * 此表来自:https://github.com/jjonline/calendar.js/blob/master/calendar.js diff --git a/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java index 57d6eb717..1d9df253e 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java @@ -1,13 +1,16 @@ package cn.hutool.core.date; +import cn.hutool.core.lang.Console; import org.junit.Assert; import org.junit.Test; import java.time.Duration; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAccessor; public class LocalDateTimeUtilTest { @@ -217,4 +220,11 @@ public class LocalDateTimeUtilTest { final int weekOfYear2 = LocalDateTimeUtil.weekOfYear(date1.atStartOfDay()); Assert.assertEquals(5, weekOfYear2); } + + @Test + public void ofTest2(){ + final Instant instant = DateUtil.parse("2022-02-22").toInstant(); + final LocalDateTime of = LocalDateTimeUtil.of((TemporalAccessor) instant); + Console.log(of); + } }