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 {
/**
* 标准日期时间正则每个字段支持单个数字或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
//================================================== Normal ==================================================
/**

View File

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

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.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);

View File

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

View File

@ -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();

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.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;
/**
* 标准日期字符串解析支持格式
* <pre>
@ -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);

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
* @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();

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.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);