lt = patterns.listIterator();
while (lt.hasNext()) {
final StrategyAndWidth strategyAndWidth = lt.next();
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PositionDateParser.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PositionDateParser.java
index cee573b05..b14b7b7f1 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PositionDateParser.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/PositionDateParser.java
@@ -16,7 +16,10 @@
package org.dromara.hutool.core.date.format.parser;
+import org.dromara.hutool.core.date.DateException;
+import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.date.format.DateBasic;
+import org.dromara.hutool.core.lang.Assert;
import java.text.ParsePosition;
import java.util.Calendar;
@@ -26,10 +29,23 @@ import java.util.Date;
* 带有{@link ParsePosition}的日期解析接口,用于解析日期字符串为 {@link Date} 对象
* Thanks to Apache Commons Lang 3.5
*
- * @since 2.16.2
+ * @author Looly
+ * @since 6.0.0
*/
public interface PositionDateParser extends DateParser, DateBasic {
+ /**
+ * 根据给定格式更新{@link Calendar}
+ * 解析成功后,{@link ParsePosition#getIndex()}更新成转换到的位置
+ * 失败则{@link ParsePosition#getErrorIndex()}更新到解析失败的位置
+ *
+ * @param source 被转换的日期字符串
+ * @param pos 定义开始转换的位置,转换结束后更新转换到的位置,{@code null}表示忽略,从第一个字符开始转换
+ * @param calendar 解析并更新的{@link Calendar}
+ * @return 解析成功返回 {@code true},否则返回{@code false}
+ */
+ boolean parse(CharSequence source, ParsePosition pos, Calendar calendar);
+
/**
* 将日期字符串解析并转换为 {@link Date} 对象
* 等价于 {@link java.text.DateFormat#parse(String, ParsePosition)}
@@ -38,17 +54,31 @@ public interface PositionDateParser extends DateParser, DateBasic {
* @param pos {@link ParsePosition}
* @return {@link Date}
*/
- Date parse(CharSequence source, ParsePosition pos);
+ default Date parse(final CharSequence source, final ParsePosition pos){
+ return parseCalendar(source, pos, DateUtil.isGlobalLenient()).getTime();
+ }
/**
- * 根据给定格式更新{@link Calendar}
- * 解析成功后,{@link ParsePosition#getIndex()}更新成转换到的位置
- * 失败则{@link ParsePosition#getErrorIndex()}更新到解析失败的位置
+ * 将日期字符串解析并转换为 {@link Calendar} 对象
*
- * @param source 被转换的日期字符串
- * @param pos 定义开始转换的位置,转换结束后更新转换到的位置
- * @param calendar 解析并更新的{@link Calendar}
- * @return 解析成功返回 {@code true},否则返回{@code false}
+ * @param source 日期字符串
+ * @param pos {@link ParsePosition}
+ * @param lenient 是否宽容模式
+ * @return {@link Calendar}
*/
- boolean parse(CharSequence source, ParsePosition pos, Calendar calendar);
+ default Calendar parseCalendar(final CharSequence source, final ParsePosition pos, final boolean lenient){
+ Assert.notBlank(source, "Date str must be not blank!");
+
+ // timing tests indicate getting new instance is 19% faster than cloning
+ final Calendar calendar = Calendar.getInstance(getTimeZone(), getLocale());
+ calendar.clear();
+ calendar.setLenient(lenient);
+
+ if (parse(source.toString(), pos, calendar)) {
+ return calendar;
+ }
+
+ throw new DateException("Parse [{}] with format [{}] error, at: {}",
+ source, getPattern(), pos.getErrorIndex());
+ }
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/package-info.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/package-info.java
index d20d737aa..a791d1f74 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/package-info.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/format/parser/package-info.java
@@ -17,10 +17,10 @@
/**
* 提供日期解析相关封装,主要包括:
*
- * DateParser
- * / \
- * FastDateParser RegisterDateParser
- * (根据日期格式解析) (根据注册的模式匹配解析)
+ * DateParser
+ * / | \
+ * FastDateParser RegisterDateParser RegexDateParser
+ * (根据日期格式解析) (根据注册的模式匹配解析) (通过预定义正则解析)
*
*
* @author looly