From c92ccb7316621b527cbdb146f9a1d85a7342cad2 Mon Sep 17 00:00:00 2001 From: duandazhi Date: Thu, 19 Aug 2021 16:17:20 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81DateUtil=20=20yyyy-MM-dd=20HH:mm:ss.S?= =?UTF-8?q?SSSSS=20=E6=A0=BC=E5=BC=8F=E6=94=AF=E6=8C=81=202=E3=80=81DateCo?= =?UTF-8?q?nverter=20=E5=A2=9E=E5=8A=A0=E9=AA=8C=E8=AF=81=EF=BC=8C=20?= =?UTF-8?q?=E5=85=A5=E5=8F=82=E6=98=AF=20=E7=A9=BA=E4=B8=B2=EF=BC=8C?= =?UTF-8?q?=E8=BF=94=E5=9B=9Enull,=20=E8=80=8C=E4=B8=8D=E6=98=AF=E6=8A=9B?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=EF=BC=9B=20=EF=BC=88=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=BC=9A=E5=87=BA=E7=8E=B0=20=E7=A9=BA?= =?UTF-8?q?=E4=B8=B2=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=9B=20=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=BA=A4=E7=BB=99=E8=B0=83=E7=94=A8=E8=80=85=E8=87=AA?= =?UTF-8?q?=E8=A1=8C=E6=8A=9B=E5=87=BA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/convert/impl/DateConverter.java | 3 +++ .../java/cn/hutool/core/date/DatePattern.java | 16 ++++++++++++++- .../java/cn/hutool/core/date/DateUtil.java | 12 ++++++++--- .../cn/hutool/core/date/DateUtilTest.java | 20 +++++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java index f659f42bd..cbd2dbd7b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java @@ -62,6 +62,9 @@ public class DateConverter extends AbstractConverter { @Override protected java.util.Date convertInternal(Object value) { + if (value == null || (value instanceof CharSequence && StrUtil.isBlank(value.toString()))) { + return null; + } if (value instanceof TemporalAccessor) { return wrap(DateUtil.date((TemporalAccessor) value)); } else if (value instanceof Calendar) { diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java b/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java index 4107fb2a8..bbced88d7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java @@ -18,6 +18,7 @@ public class DatePattern { /** * 标准日期时间正则,每个字段支持单个数字或2个数字,包括: *
+	 *     yyyy-MM-dd HH:mm:ss.SSSSSS
 	 *     yyyy-MM-dd HH:mm:ss.SSS
 	 *     yyyy-MM-dd HH:mm:ss
 	 *     yyyy-MM-dd HH:mm
@@ -26,7 +27,7 @@ public class DatePattern {
 	 *
 	 * @since 5.3.6
 	 */
-	public static final Pattern REGEX_NORM = Pattern.compile("\\d{4}-\\d{1,2}-\\d{1,2}(\\s\\d{1,2}:\\d{1,2}(:\\d{1,2})?)?(.\\d{1,3})?");
+	public static final Pattern REGEX_NORM = Pattern.compile("\\d{4}-\\d{1,2}-\\d{1,2}(\\s\\d{1,2}:\\d{1,2}(:\\d{1,2})?)?(.\\d{1,6})?");
 
 	//-------------------------------------------------------------------------------------------------------------------------------- Normal
 	/**
@@ -120,6 +121,19 @@ public class DatePattern {
 	 */
 	public static final DateTimeFormatter NORM_DATETIME_MS_FORMATTER = createFormatter(NORM_DATETIME_MS_PATTERN);
 
+	/**
+	 * 标准日期时间格式,精确到毫秒:yyyy-MM-dd HH:mm:ss.SSSSSS
+	 */
+	public static final String NORM_DATETIME_MS_FULL_PATTERN = "yyyy-MM-dd HH:mm:ss.SSSSSS";
+	/**
+	 * 标准日期时间格式,精确到毫秒 {@link FastDateFormat}:yyyy-MM-dd HH:mm:ss.SSSSSS
+	 */
+	public static final FastDateFormat NORM_DATETIME_MS_FULL_FORMAT = FastDateFormat.getInstance(NORM_DATETIME_MS_PATTERN);
+	/**
+	 * 标准日期时间格式,精确到毫秒 {@link FastDateFormat}:yyyy-MM-dd HH:mm:ss.SSSSSS
+	 */
+	public static final DateTimeFormatter NORM_DATETIME_MS_FULL_FORMATTER = createFormatter(NORM_DATETIME_MS_PATTERN);
+
 	/**
 	 * ISO8601日期时间格式,精确到毫秒:yyyy-MM-dd HH:mm:ss,SSS
 	 */
diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java
index 865c27c6b..ea6a4e6c9 100644
--- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java
@@ -899,6 +899,7 @@ public class DateUtil extends CalendarUtil {
 	 * 
  • HH时mm分ss秒
  • *
  • yyyy-MM-dd HH:mm
  • *
  • yyyy-MM-dd HH:mm:ss.SSS
  • + *
  • yyyy-MM-dd HH:mm:ss.SSSSSS
  • *
  • yyyyMMddHHmmss
  • *
  • yyyyMMddHHmmssSSS
  • *
  • yyyyMMdd
  • @@ -928,7 +929,7 @@ public class DateUtil extends CalendarUtil { return parse(dateStr, DatePattern.PURE_DATETIME_FORMAT); } else if (length == DatePattern.PURE_DATETIME_MS_PATTERN.length()) { return parse(dateStr, DatePattern.PURE_DATETIME_MS_FORMAT); - } else if (length == DatePattern.PURE_DATE_PATTERN.length()) { + }else if (length == DatePattern.PURE_DATE_PATTERN.length()) { return parse(dateStr, DatePattern.PURE_DATE_FORMAT); } else if (length == DatePattern.PURE_TIME_PATTERN.length()) { return parse(dateStr, DatePattern.PURE_TIME_FORMAT); @@ -960,8 +961,13 @@ public class DateUtil extends CalendarUtil { return parse(dateStr, DatePattern.NORM_DATETIME_MINUTE_FORMAT); case 2: if (StrUtil.contains(dateStr, CharUtil.DOT)) { - // yyyy-MM-dd HH:mm:ss.SSS - return parse(dateStr, DatePattern.NORM_DATETIME_MS_FORMAT); + if (dateStr.length() == DatePattern.NORM_DATETIME_MS_PATTERN.length()) { + // yyyy-MM-dd HH:mm:ss.SSS + return parse(dateStr, DatePattern.NORM_DATETIME_MS_FORMAT); + } else { + // yyyy-MM-dd HH:mm:ss.SSSSSS + return parse(dateStr, DatePattern.NORM_DATETIME_MS_FULL_FORMAT); + } } // yyyy-MM-dd HH:mm:ss return parse(dateStr, DatePattern.NORM_DATETIME_FORMAT); 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 79e9d638d..515a0ede4 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 @@ -456,6 +456,26 @@ public class DateUtilTest { Assert.assertEquals("2020-06-28 02:14:13", dateTime.toString()); } + /** + * 测试支持:yyyy-MM-dd HH:mm:ss.SSSSSS 格式 + */ + @Test + public void parseTest9() { + String str = "2020-02-06 01:58:00.000020"; + DateTime dateTime = DateUtil.parse(str); + assert dateTime != null; + } + + /** + * 测试字符串是空,返回null, 而不是直接报错; + */ + @Test + public void parseTest10() { + String str = ""; + DateTime dateTime = DateUtil.parse(str); + Assert.assertNull(dateTime); + } + @Test public void parseUTCOffsetTest() { // issue#I437AP@Gitee