mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
add PredicateDateParser
This commit is contained in:
parent
701120b169
commit
251c6ee6ee
@ -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 ==================================================
|
||||
/**
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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> {
|
||||
}
|
@ -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();
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user