diff --git a/CHANGELOG.md b/CHANGELOG.md index beb94df4a..c0dc5ab36 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ * 【json 】 修复toJSONString导致CPU使用率高的问题(issue#3297@Github) * 【core 】 修复NumberUtil.parseInt 16进制解析错误的问题(pr#1071@Gitee) * 【core 】 修复CopyOptions.setIgnoreCase和setIgnoreProperties冲突问题(issue#I80FP4@Gitee) +* 【core 】 修复LocalDateTimeUtil.of 某些特殊TemporalAccessor无法返回正确结果的问题(issue#3301@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.21(2023-07-29) 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 3ea5d9a40..bdc7de543 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java @@ -171,8 +171,25 @@ public class LocalDateTimeUtil { return ((LocalDate) temporalAccessor).atStartOfDay(); } else if(temporalAccessor instanceof Instant){ return LocalDateTime.ofInstant((Instant) temporalAccessor, ZoneId.systemDefault()); - } else if(temporalAccessor instanceof ZonedDateTime){ - return ((ZonedDateTime)temporalAccessor).toLocalDateTime(); + } + + // issue#3301 + try{ + return LocalDateTime.from(temporalAccessor); + } catch (final Exception ignore){ + //ignore + } + + try{ + return ZonedDateTime.from(temporalAccessor).toLocalDateTime(); + } catch (final Exception ignore){ + //ignore + } + + try{ + return LocalDateTime.ofInstant(Instant.from(temporalAccessor), ZoneId.systemDefault()); + } catch (final Exception ignore){ + //ignore } return LocalDateTime.of( diff --git a/hutool-core/src/test/java/cn/hutool/core/date/Issue3301Test.java b/hutool-core/src/test/java/cn/hutool/core/date/Issue3301Test.java new file mode 100644 index 000000000..a3fa2523a --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/date/Issue3301Test.java @@ -0,0 +1,22 @@ +package cn.hutool.core.date; + +import org.junit.Assert; +import org.junit.Test; + +import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; + +public class Issue3301Test { + @Test + public void ofTest() { + final ZonedDateTime now = ZonedDateTime.now(); + // 获得一个特殊的 temporal + String text = DateTimeFormatter.ISO_INSTANT.format(now); + TemporalAccessor temporal = DateTimeFormatter.ISO_INSTANT.parse(text); + + LocalDateTime actual = LocalDateTimeUtil.of(temporal); + Assert.assertEquals(now.toLocalDateTime().toString(), actual.toString()); + } +} 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 579a7c14a..6bae06b96 100755 --- 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,6 +1,5 @@ package cn.hutool.core.date; -import cn.hutool.core.lang.Console; import org.junit.Assert; import org.junit.Test; @@ -133,6 +132,13 @@ public class LocalDateTimeUtilTest { Assert.assertEquals("2020-01-22T12:23:56", offset.toString()); } + @Test + public void ofTest2(){ + final Instant instant = Objects.requireNonNull(DateUtil.parse("2022-02-22")).toInstant(); + final LocalDateTime of = LocalDateTimeUtil.of((TemporalAccessor) instant); + Assert.assertEquals("2022-02-22T00:00", of.toString()); + } + @Test public void between() { final Duration between = LocalDateTimeUtil.between( @@ -281,13 +287,6 @@ public class LocalDateTimeUtilTest { Assert.assertEquals(5, weekOfYear2); } - @Test - public void ofTest2(){ - final Instant instant = Objects.requireNonNull(DateUtil.parse("2022-02-22")).toInstant(); - final LocalDateTime of = LocalDateTimeUtil.of((TemporalAccessor) instant); - Console.log(of); - } - @Test public void parseBlankTest(){ final LocalDateTime parse = LocalDateTimeUtil.parse("");