diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/DatePattern.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/DatePattern.java index a059053a3..fd1425c63 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/DatePattern.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/DatePattern.java @@ -87,20 +87,6 @@ import java.util.regex.Pattern; */ 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
-	 *     yyyy-MM-dd
-	 * 
- * - * @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,6})?)?"); - // region Normal //================================================== Normal ================================================== /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/DateUtil.java index 96e7e6897..6c9998fed 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/DateUtil.java @@ -48,15 +48,6 @@ import java.util.stream.Collectors; */ public class DateUtil extends CalendarUtil { - /** - * java.util.Date EEE MMM zzz 缩写数组 - */ - private final static String[] wtb = { // - "sun", "mon", "tue", "wed", "thu", "fri", "sat", // 星期 - "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", // 月份 - "gmt", "ut", "utc", "est", "edt", "cst", "cdt", "mst", "mdt", "pst", "pdt"// 时间标准 - }; - // region ----- date /** * 当前时间,转换为{@link DateTime}对象 @@ -816,26 +807,27 @@ public class DateUtil extends CalendarUtil { // 去掉两边空格并去掉中文日期中的“日”和“秒”,以规范长度 dateStr = StrUtil.removeAll(dateStr.trim(), '日', '秒'); - if (NumberUtil.isNumber(dateStr)) { + if (PureDateParser.INSTANCE.test(dateStr)) { // 纯数字形式 return PureDateParser.INSTANCE.parse(dateStr); - } else if (ReUtil.isMatch(PatternPool.TIME, dateStr)) { + } else if (TimeParser.INSTANCE.test(dateStr)) { // HH:mm:ss 或者 HH:mm 时间格式匹配单独解析 return TimeParser.INSTANCE.parse(dateStr); - } else if (StrUtil.containsAnyIgnoreCase(dateStr, wtb)) { + } else if (CSTDateParser.INSTANCE.test(dateStr)) { // JDK的Date对象toString默认格式,类似于: // Tue Jun 4 16:25:15 +0800 2019 // Thu May 16 17:57:18 GMT+08:00 2019 // Wed Aug 01 00:00:00 CST 2012 return CSTDateParser.INSTANCE.parse(dateStr); - } else if (StrUtil.contains(dateStr, 'T')) { + } else if (ISO8601DateParser.INSTANCE.test(dateStr)) { // ISO8601标准时间 return ISO8601DateParser.INSTANCE.parse(dateStr); } //标准日期格式(包括单个数字的日期时间) dateStr = normalize(dateStr); - if (ReUtil.isMatch(DatePattern.REGEX_NORM, dateStr)) { + + if (NormalDateParser.INSTANCE.test(dateStr)) { return NormalDateParser.INSTANCE.parse(dateStr); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/CSTDateParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/CSTDateParser.java index d9e03f900..b8f855dd4 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/CSTDateParser.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/CSTDateParser.java @@ -15,6 +15,7 @@ package org.dromara.hutool.core.date.format.parser; import org.dromara.hutool.core.date.DatePattern; import org.dromara.hutool.core.date.DateTime; import org.dromara.hutool.core.date.format.DefaultDateBasic; +import org.dromara.hutool.core.text.StrUtil; /** * CST日期字符串(JDK的Date对象toString默认格式)解析,支持格式类似于; @@ -27,13 +28,28 @@ import org.dromara.hutool.core.date.format.DefaultDateBasic; * @author looly * @since 6.0.0 */ -public class CSTDateParser extends DefaultDateBasic implements DateParser { +public class CSTDateParser extends DefaultDateBasic implements PredicateDateParser { private static final long serialVersionUID = 1L; + + /** + * java.util.Date EEE MMM zzz 缩写数组 + */ + private final static String[] wtb = { // + "sun", "mon", "tue", "wed", "thu", "fri", "sat", // 星期 + "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", // 月份 + "gmt", "ut", "utc", "est", "edt", "cst", "cdt", "mst", "mdt", "pst", "pdt"// 时间标准 + }; + /** * 单例对象 */ public static CSTDateParser INSTANCE = new CSTDateParser(); + @Override + public boolean test(final CharSequence dateStr) { + return StrUtil.containsAnyIgnoreCase(dateStr, wtb); + } + @Override public DateTime parse(final String source) { return new DateTime(source, DatePattern.JDK_DATETIME_FORMAT); diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/DateParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/DateParser.java index b8512d3e2..1f12296ca 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/DateParser.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/DateParser.java @@ -21,7 +21,7 @@ import java.util.Date; * 日期解析接口,用于解析日期字符串为 {@link Date} 对象
* Thanks to Apache Commons Lang 3.5 */ -public interface DateParser extends DateBasic { +public interface DateParser extends DateBasic{ /** * 将日期字符串解析并转换为 {@link Date} 对象
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/ISO8601DateParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/ISO8601DateParser.java index 9cfd1375a..404c64e04 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/ISO8601DateParser.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/ISO8601DateParser.java @@ -35,7 +35,7 @@ import org.dromara.hutool.core.text.CharUtil; * @author looly * @since 6.0.0 */ -public class ISO8601DateParser extends DefaultDateBasic implements DateParser { +public class ISO8601DateParser extends DefaultDateBasic implements PredicateDateParser { private static final long serialVersionUID = 1L; /** @@ -43,6 +43,11 @@ public class ISO8601DateParser extends DefaultDateBasic implements DateParser { */ public static ISO8601DateParser INSTANCE = new ISO8601DateParser(); + @Override + public boolean test(final CharSequence dateStr) { + return StrUtil.contains(dateStr, 'T'); + } + @Override public DateTime parse(String source) { final int length = source.length(); diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/NormalDateParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/NormalDateParser.java index a6a08488e..68c7d90ac 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/NormalDateParser.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/NormalDateParser.java @@ -17,9 +17,12 @@ import org.dromara.hutool.core.date.DatePattern; import org.dromara.hutool.core.date.DateTime; import org.dromara.hutool.core.date.format.DefaultDateBasic; import org.dromara.hutool.core.lang.Console; +import org.dromara.hutool.core.regex.ReUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.CharUtil; +import java.util.regex.Pattern; + /** * 标准日期字符串解析,支持格式; *
@@ -33,14 +36,21 @@ import org.dromara.hutool.core.text.CharUtil;
  * @author looly
  * @since 6.0.0
  */
-public class NormalDateParser extends DefaultDateBasic implements DateParser {
+public class NormalDateParser extends DefaultDateBasic implements PredicateDateParser {
 	private static final long serialVersionUID = 1L;
 
+	private static final Pattern patternNorm = Pattern.compile("\\d{4}-\\d{1,2}-\\d{1,2}(\\s\\d{1,2}:\\d{1,2}(:\\d{1,2})?(.\\d{1,6})?)?");
+
 	/**
 	 * 单例
 	 */
 	public static NormalDateParser INSTANCE = new NormalDateParser();
 
+	@Override
+	public boolean test(final CharSequence dateStr) {
+		return ReUtil.isMatch(patternNorm, dateStr);
+	}
+
 	@Override
 	public DateTime parse(String source) {
 		final int colonCount = StrUtil.count(source, CharUtil.COLON);
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PredicateDateParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PredicateDateParser.java
new file mode 100644
index 000000000..20b4dbba8
--- /dev/null
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PredicateDateParser.java
@@ -0,0 +1,12 @@
+package org.dromara.hutool.core.date.format.parser;
+
+import java.util.function.Predicate;
+
+/**
+ * 通过判断字符串的匹配,解析为日期
+ *
+ * @author looly
+ * @since 6.0.0
+ */
+public interface PredicateDateParser extends DateParser, Predicate {
+}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PureDateParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PureDateParser.java
index 10a5143d3..4f2d682ea 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PureDateParser.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PureDateParser.java
@@ -31,7 +31,7 @@ import org.dromara.hutool.core.math.NumberUtil;
  * @author looly
  * @since 6.0.0
  */
-public class PureDateParser extends DefaultDateBasic implements DateParser {
+public class PureDateParser extends DefaultDateBasic implements PredicateDateParser {
 	private static final long serialVersionUID = 1L;
 
 	/**
@@ -39,6 +39,11 @@ public class PureDateParser extends DefaultDateBasic implements DateParser {
 	 */
 	public static PureDateParser INSTANCE = new PureDateParser();
 
+	@Override
+	public boolean test(final CharSequence dateStr) {
+		return NumberUtil.isNumber(dateStr);
+	}
+
 	@Override
 	public DateTime parse(final String source) throws DateException {
 		final int length = source.length();
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/TimeParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/TimeParser.java
index c1e28083b..24417da0e 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/TimeParser.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/TimeParser.java
@@ -16,6 +16,8 @@ import org.dromara.hutool.core.date.DatePattern;
 import org.dromara.hutool.core.date.DateTime;
 import org.dromara.hutool.core.date.DateUtil;
 import org.dromara.hutool.core.date.format.DefaultDateBasic;
+import org.dromara.hutool.core.regex.PatternPool;
+import org.dromara.hutool.core.regex.ReUtil;
 import org.dromara.hutool.core.text.StrUtil;
 
 /**
@@ -28,7 +30,7 @@ import org.dromara.hutool.core.text.StrUtil;
  * @author looly
  * @since 6.0.0
  */
-public class TimeParser extends DefaultDateBasic implements DateParser {
+public class TimeParser extends DefaultDateBasic implements PredicateDateParser {
 	private static final long serialVersionUID = 1L;
 
 	/**
@@ -36,6 +38,11 @@ public class TimeParser extends DefaultDateBasic implements DateParser {
 	 */
 	public static TimeParser INSTANCE = new TimeParser();
 
+	@Override
+	public boolean test(final CharSequence dateStr) {
+		return ReUtil.isMatch(PatternPool.TIME, dateStr);
+	}
+
 	@Override
 	public DateTime parse(String source) {
 		source = StrUtil.format("{} {}", DateUtil.formatToday(), source);