From 111898c640223f601e8c0601548ba142373e806a Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 13 Sep 2023 20:33:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DLocalDateTimeUtil.of=20?= =?UTF-8?q?=E6=9F=90=E4=BA=9B=E7=89=B9=E6=AE=8ATemporalAccessor=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=BF=94=E5=9B=9E=E6=AD=A3=E7=A1=AE=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../hutool/core/date/LocalDateTimeUtil.java | 21 ++++++++++++++++-- .../cn/hutool/core/date/Issue3301Test.java | 22 +++++++++++++++++++ .../core/date/LocalDateTimeUtilTest.java | 15 ++++++------- 4 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 hutool-core/src/test/java/cn/hutool/core/date/Issue3301Test.java 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("");