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} 对象
@@ -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);