add PredicateDateParser

This commit is contained in:
Looly 2023-12-14 22:38:13 +08:00
parent 701120b169
commit 251c6ee6ee
9 changed files with 67 additions and 34 deletions

View File

@ -87,20 +87,6 @@ import java.util.regex.Pattern;
*/ */
public class DatePattern { public class DatePattern {
/**
* 标准日期时间正则每个字段支持单个数字或2个数字包括
* <pre>
* 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
* </pre>
*
* @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 // region Normal
//================================================== Normal ================================================== //================================================== Normal ==================================================
/** /**

View File

@ -48,15 +48,6 @@ import java.util.stream.Collectors;
*/ */
public class DateUtil extends CalendarUtil { 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 // region ----- date
/** /**
* 当前时间转换为{@link DateTime}对象 * 当前时间转换为{@link DateTime}对象
@ -816,26 +807,27 @@ public class DateUtil extends CalendarUtil {
// 去掉两边空格并去掉中文日期中的以规范长度 // 去掉两边空格并去掉中文日期中的以规范长度
dateStr = StrUtil.removeAll(dateStr.trim(), '日', '秒'); dateStr = StrUtil.removeAll(dateStr.trim(), '日', '秒');
if (NumberUtil.isNumber(dateStr)) { if (PureDateParser.INSTANCE.test(dateStr)) {
// 纯数字形式 // 纯数字形式
return PureDateParser.INSTANCE.parse(dateStr); return PureDateParser.INSTANCE.parse(dateStr);
} else if (ReUtil.isMatch(PatternPool.TIME, dateStr)) { } else if (TimeParser.INSTANCE.test(dateStr)) {
// HH:mm:ss 或者 HH:mm 时间格式匹配单独解析 // HH:mm:ss 或者 HH:mm 时间格式匹配单独解析
return TimeParser.INSTANCE.parse(dateStr); return TimeParser.INSTANCE.parse(dateStr);
} else if (StrUtil.containsAnyIgnoreCase(dateStr, wtb)) { } else if (CSTDateParser.INSTANCE.test(dateStr)) {
// JDK的Date对象toString默认格式类似于 // JDK的Date对象toString默认格式类似于
// Tue Jun 4 16:25:15 +0800 2019 // Tue Jun 4 16:25:15 +0800 2019
// Thu May 16 17:57:18 GMT+08:00 2019 // Thu May 16 17:57:18 GMT+08:00 2019
// Wed Aug 01 00:00:00 CST 2012 // Wed Aug 01 00:00:00 CST 2012
return CSTDateParser.INSTANCE.parse(dateStr); return CSTDateParser.INSTANCE.parse(dateStr);
} else if (StrUtil.contains(dateStr, 'T')) { } else if (ISO8601DateParser.INSTANCE.test(dateStr)) {
// ISO8601标准时间 // ISO8601标准时间
return ISO8601DateParser.INSTANCE.parse(dateStr); return ISO8601DateParser.INSTANCE.parse(dateStr);
} }
//标准日期格式包括单个数字的日期时间 //标准日期格式包括单个数字的日期时间
dateStr = normalize(dateStr); dateStr = normalize(dateStr);
if (ReUtil.isMatch(DatePattern.REGEX_NORM, dateStr)) {
if (NormalDateParser.INSTANCE.test(dateStr)) {
return NormalDateParser.INSTANCE.parse(dateStr); return NormalDateParser.INSTANCE.parse(dateStr);
} }

View File

@ -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.DatePattern;
import org.dromara.hutool.core.date.DateTime; import org.dromara.hutool.core.date.DateTime;
import org.dromara.hutool.core.date.format.DefaultDateBasic; import org.dromara.hutool.core.date.format.DefaultDateBasic;
import org.dromara.hutool.core.text.StrUtil;
/** /**
* CST日期字符串JDK的Date对象toString默认格式解析支持格式类似于 * CST日期字符串JDK的Date对象toString默认格式解析支持格式类似于
@ -27,13 +28,28 @@ import org.dromara.hutool.core.date.format.DefaultDateBasic;
* @author looly * @author looly
* @since 6.0.0 * @since 6.0.0
*/ */
public class CSTDateParser extends DefaultDateBasic implements DateParser { public class CSTDateParser extends DefaultDateBasic implements PredicateDateParser {
private static final long serialVersionUID = 1L; 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(); public static CSTDateParser INSTANCE = new CSTDateParser();
@Override
public boolean test(final CharSequence dateStr) {
return StrUtil.containsAnyIgnoreCase(dateStr, wtb);
}
@Override @Override
public DateTime parse(final String source) { public DateTime parse(final String source) {
return new DateTime(source, DatePattern.JDK_DATETIME_FORMAT); return new DateTime(source, DatePattern.JDK_DATETIME_FORMAT);

View File

@ -21,7 +21,7 @@ import java.util.Date;
* 日期解析接口用于解析日期字符串为 {@link Date} 对象<br> * 日期解析接口用于解析日期字符串为 {@link Date} 对象<br>
* Thanks to Apache Commons Lang 3.5 * Thanks to Apache Commons Lang 3.5
*/ */
public interface DateParser extends DateBasic { public interface DateParser extends DateBasic{
/** /**
* 将日期字符串解析并转换为 {@link Date} 对象<br> * 将日期字符串解析并转换为 {@link Date} 对象<br>

View File

@ -35,7 +35,7 @@ import org.dromara.hutool.core.text.CharUtil;
* @author looly * @author looly
* @since 6.0.0 * @since 6.0.0
*/ */
public class ISO8601DateParser extends DefaultDateBasic implements DateParser { public class ISO8601DateParser extends DefaultDateBasic implements PredicateDateParser {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
@ -43,6 +43,11 @@ public class ISO8601DateParser extends DefaultDateBasic implements DateParser {
*/ */
public static ISO8601DateParser INSTANCE = new ISO8601DateParser(); public static ISO8601DateParser INSTANCE = new ISO8601DateParser();
@Override
public boolean test(final CharSequence dateStr) {
return StrUtil.contains(dateStr, 'T');
}
@Override @Override
public DateTime parse(String source) { public DateTime parse(String source) {
final int length = source.length(); final int length = source.length();

View File

@ -17,9 +17,12 @@ import org.dromara.hutool.core.date.DatePattern;
import org.dromara.hutool.core.date.DateTime; import org.dromara.hutool.core.date.DateTime;
import org.dromara.hutool.core.date.format.DefaultDateBasic; import org.dromara.hutool.core.date.format.DefaultDateBasic;
import org.dromara.hutool.core.lang.Console; 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.StrUtil;
import org.dromara.hutool.core.text.CharUtil; import org.dromara.hutool.core.text.CharUtil;
import java.util.regex.Pattern;
/** /**
* 标准日期字符串解析支持格式 * 标准日期字符串解析支持格式
* <pre> * <pre>
@ -33,14 +36,21 @@ import org.dromara.hutool.core.text.CharUtil;
* @author looly * @author looly
* @since 6.0.0 * @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 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(); public static NormalDateParser INSTANCE = new NormalDateParser();
@Override
public boolean test(final CharSequence dateStr) {
return ReUtil.isMatch(patternNorm, dateStr);
}
@Override @Override
public DateTime parse(String source) { public DateTime parse(String source) {
final int colonCount = StrUtil.count(source, CharUtil.COLON); final int colonCount = StrUtil.count(source, CharUtil.COLON);

View File

@ -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<CharSequence> {
}

View File

@ -31,7 +31,7 @@ import org.dromara.hutool.core.math.NumberUtil;
* @author looly * @author looly
* @since 6.0.0 * @since 6.0.0
*/ */
public class PureDateParser extends DefaultDateBasic implements DateParser { public class PureDateParser extends DefaultDateBasic implements PredicateDateParser {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
@ -39,6 +39,11 @@ public class PureDateParser extends DefaultDateBasic implements DateParser {
*/ */
public static PureDateParser INSTANCE = new PureDateParser(); public static PureDateParser INSTANCE = new PureDateParser();
@Override
public boolean test(final CharSequence dateStr) {
return NumberUtil.isNumber(dateStr);
}
@Override @Override
public DateTime parse(final String source) throws DateException { public DateTime parse(final String source) throws DateException {
final int length = source.length(); final int length = source.length();

View File

@ -16,6 +16,8 @@ import org.dromara.hutool.core.date.DatePattern;
import org.dromara.hutool.core.date.DateTime; import org.dromara.hutool.core.date.DateTime;
import org.dromara.hutool.core.date.DateUtil; import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.date.format.DefaultDateBasic; 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; import org.dromara.hutool.core.text.StrUtil;
/** /**
@ -28,7 +30,7 @@ import org.dromara.hutool.core.text.StrUtil;
* @author looly * @author looly
* @since 6.0.0 * @since 6.0.0
*/ */
public class TimeParser extends DefaultDateBasic implements DateParser { public class TimeParser extends DefaultDateBasic implements PredicateDateParser {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
@ -36,6 +38,11 @@ public class TimeParser extends DefaultDateBasic implements DateParser {
*/ */
public static TimeParser INSTANCE = new TimeParser(); public static TimeParser INSTANCE = new TimeParser();
@Override
public boolean test(final CharSequence dateStr) {
return ReUtil.isMatch(PatternPool.TIME, dateStr);
}
@Override @Override
public DateTime parse(String source) { public DateTime parse(String source) {
source = StrUtil.format("{} {}", DateUtil.formatToday(), source); source = StrUtil.format("{} {}", DateUtil.formatToday(), source);