diff --git a/CHANGELOG.md b/CHANGELOG.md index f854a8372..7a583c895 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ ### 🐞Bug修复 * 【core 】 修复CollUtil.isEqualList两个null返回错误问题(issue#1885@Github) * 【poi 】 修复ExcelWriter多余调试信息导致的问题(issue#1884@Github) +* 【poi 】 修复TemporalAccessorUtil.toInstant使用DateTimeFormatter导致问题(issue#1891@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java index f9b37927f..6758c3768 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java @@ -167,7 +167,7 @@ public class DateTime extends Date { * @since 5.0.5 */ public DateTime(Instant instant, ZoneId zoneId) { - this(instant.toEpochMilli(), TimeZone.getTimeZone(ObjectUtil.defaultIfNull(zoneId, ZoneId.systemDefault()))); + this(instant.toEpochMilli(), ZoneUtil.toTimeZone(zoneId)); } /** @@ -177,7 +177,7 @@ public class DateTime extends Date { * @since 5.0.0 */ public DateTime(TemporalAccessor temporalAccessor) { - this(DateUtil.toInstant(temporalAccessor)); + this(TemporalAccessorUtil.toInstant(temporalAccessor)); } /** @@ -276,7 +276,7 @@ public class DateTime extends Date { * @since 5.0.0 */ public DateTime(CharSequence dateStr, DateTimeFormatter formatter) { - this(Instant.from(formatter.parse(dateStr)), formatter.getZone()); + this(TemporalAccessorUtil.toInstant(formatter.parse(dateStr)), formatter.getZone()); } /** 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 f2918c55e..1d9baef32 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 @@ -138,7 +138,10 @@ public class TemporalAccessorUtil extends TemporalUtil{ // 指定本地时间转换 为Instant,取当天日期 result = ((OffsetTime) temporalAccessor).atDate(LocalDate.now()).toInstant(); } else { - result = Instant.from(temporalAccessor); + // issue#1891@Github + // Instant.from不能完成日期转换 + //result = Instant.from(temporalAccessor); + result = toInstant(LocalDateTimeUtil.of(temporalAccessor)); } return result; diff --git a/hutool-core/src/main/java/cn/hutool/core/date/ZoneUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/ZoneUtil.java new file mode 100644 index 000000000..1b12788da --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/date/ZoneUtil.java @@ -0,0 +1,41 @@ +package cn.hutool.core.date; + +import java.time.ZoneId; +import java.util.TimeZone; + +/** + * {@link ZoneId}和{@link TimeZone}相关封装 + * + * @author looly + * @since 5.7.15 + */ +public class ZoneUtil { + + /** + * {@link ZoneId}转换为{@link TimeZone},{@code null}则返回系统默认值 + * + * @param zoneId {@link ZoneId},{@code null}则返回系统默认值 + * @return {@link TimeZone} + */ + public static TimeZone toTimeZone(ZoneId zoneId) { + if (null == zoneId) { + return TimeZone.getDefault(); + } + + return TimeZone.getTimeZone(zoneId); + } + + /** + * {@link TimeZone}转换为{@link ZoneId},{@code null}则返回系统默认值 + * + * @param timeZone {@link TimeZone},{@code null}则返回系统默认值 + * @return {@link ZoneId} + */ + public static ZoneId toZoneId(TimeZone timeZone) { + if (null == timeZone) { + return ZoneId.systemDefault(); + } + + return timeZone.toZoneId(); + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index 05c674cf5..738995533 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -989,4 +989,10 @@ public class DateUtilTest { Assert.assertNotNull(parse); Assert.assertEquals("2021-01-01 00:00:00", parse.toString()); } + + @Test + public void parseByDateTimeFormatterTest(){ + final DateTime parse = DateUtil.parse("2021-12-01", DatePattern.NORM_DATE_FORMATTER); + Assert.assertEquals("2021-12-01 00:00:00", parse.toString()); + } }