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