|
@@ -111,13 +111,15 @@ public final class DateUtils {
|
|
|
new DatetimeParser(DateTimeFormatter.ofPattern("yyyy/M/d H:m:s"))
|
|
|
).put(
|
|
|
StringUtils.getPattern("^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}$"),
|
|
|
- new SimpleDatetimeParser("yyyy-M-d H:m:s.SSS")
|
|
|
+ new MillisDatetimeParser(new SimpleDatetimeParser("yyyy-M-d H:m:s.SSS"))
|
|
|
).put(
|
|
|
StringUtils.getPattern("^\\d{4}/\\d{1,2}/\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}$"),
|
|
|
- new SimpleDatetimeParser("yyyy-M-d H:m:s.SSS")
|
|
|
+ new MillisDatetimeParser(new SimpleDatetimeParser("yyyy-M-d H:m:s.SSS"))
|
|
|
).put(
|
|
|
StringUtils.getPattern("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}\\S+$"),
|
|
|
- new ZonedDatetimeParser(DateTimeFormatter.ofPattern("yyyy-M-d'T'H:m:s.SSSXXX"))
|
|
|
+ new MillisDatetimeParser(new ZonedDatetimeParser(
|
|
|
+ DateTimeFormatter.ofPattern("yyyy-M-d'T'H:m:s.SSSXXX")
|
|
|
+ ))
|
|
|
).put(
|
|
|
StringUtils.getPattern(
|
|
|
"^[a-zA-Z]{3} [a-zA-Z]{3} [0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} CST [0-9]{4}$"
|
|
@@ -221,6 +223,30 @@ public final class DateUtils {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 带毫秒的日期时间文本解析实现
|
|
|
+ */
|
|
|
+ public static class MillisDatetimeParser implements Parser {
|
|
|
+ private final Parser delegate;
|
|
|
+
|
|
|
+ public MillisDatetimeParser(@NonNull Parser delegate) {
|
|
|
+ this.delegate = delegate;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Date parse(String text) {
|
|
|
+ // 如果毫秒位数不足3位,则在其右边补0
|
|
|
+ int delimiter = StringUtils.isEmpty(text) ? -1 : text.lastIndexOf('.');
|
|
|
+ if (delimiter > 0) {
|
|
|
+ String millis = text.substring(++delimiter);
|
|
|
+ if (millis.length() < 3) {
|
|
|
+ text = text.substring(0, delimiter) + StringUtils.ljust(millis, 3, '0');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return this.delegate.parse(text);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 查找日期文本对应的解析器
|
|
|
*
|