From 81dbc75ba374f4b821dda8a0f67067aa993713f6 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 8 Mar 2020 07:59:18 +0800 Subject: [PATCH] fix date bug --- CHANGELOG.md | 1 + .../impl/TemporalAccessorConverter.java | 3 +- .../java/cn/hutool/core/date/DateUtil.java | 30 ++++++++++++------- .../cn/hutool/core/date/DateUtilTest.java | 8 +++++ 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49287c643..1466c14cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### 新特性 ### Bug修复 * 【setting】 修复Props.toBean方法null的问题 +* 【core 】 修复DataUtil.parseLocalDateTime无时间部分报错问题(issue#I1B18H@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java index 3375ff62d..8943fb888 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java @@ -17,6 +17,7 @@ import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.util.Calendar; import java.util.Date; +import java.util.Objects; /** * JDK8中新加入的java.time包对象解析转换器
@@ -114,7 +115,7 @@ public class TemporalAccessorConverter extends AbstractConverter * 格式 yyyy-MM-dd HH:mm:ss - * + * * @param localDateTime 被格式化的日期 * @return 格式化后的字符串 */ public static String formatLocalDateTime(LocalDateTime localDateTime) { return format(localDateTime, DatePattern.NORM_DATETIME_PATTERN); } - + /** * 根据特定格式格式化日期 + * * @param localDateTime 被格式化的日期 - * @param format 日期格式,常用格式见: {@link DatePattern} + * @param format 日期格式,常用格式见: {@link DatePattern} * @return 格式化后的字符串 */ public static String format(LocalDateTime localDateTime, String format) { @@ -538,7 +540,7 @@ public class DateUtil { DateTimeFormatter df = DateTimeFormatter.ofPattern(format); return localDateTime.format(df); } - + /** * 根据特定格式格式化日期 * @@ -693,30 +695,36 @@ public class DateUtil { // ------------------------------------ Format end ---------------------------------------------- // ------------------------------------ Parse start ---------------------------------------------- - + /** * 构建LocalDateTime对象
* 格式:yyyy-MM-dd HH:mm:ss - * + * * @param dateStr 时间字符串(带格式) * @return LocalDateTime对象 */ public static LocalDateTime parseLocalDateTime(CharSequence dateStr) { return parseLocalDateTime(dateStr, DatePattern.NORM_DATETIME_PATTERN); } - + /** * 构建LocalDateTime对象 + * * @param dateStr 时间字符串(带格式) - * @param format 使用{@link DatePattern}定义的格式 + * @param format 使用{@link DatePattern}定义的格式 * @return LocalDateTime对象 */ public static LocalDateTime parseLocalDateTime(CharSequence dateStr, String format) { dateStr = normalize(dateStr); DateTimeFormatter df = DateTimeFormatter.ofPattern(format); - return LocalDateTime.parse(dateStr,df); + try { + return LocalDateTime.parse(dateStr, df); + } catch (DateTimeParseException e) { + // 在给定日期字符串没有时间部分时,LocalDateTime会报错,此时使用LocalDate中转转换 + return LocalDate.parse(dateStr, df).atStartOfDay(); + } } - + /** * 构建DateTime对象 * 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 1d1fab4a4..b0305d3e7 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 @@ -680,4 +680,12 @@ public class DateUtilTest { strDate1 = DateUtil.format(ldt, DatePattern.NORM_DATETIME_PATTERN); Assert.assertEquals(strDate, strDate1); } + + @Test + public void localDateTimeTest2() { + // 测试字符串与LocalDateTime的互相转换 + String strDate = "2019-12-01"; + final LocalDateTime localDateTime = DateUtil.parseLocalDateTime(strDate, "yyyy-MM-dd"); + Assert.assertEquals(strDate, DateUtil.format(localDateTime, DatePattern.NORM_DATE_PATTERN)); + } }