Java如何从包含冗余数据的字符串中提取多种格式的日期
Java 从任意位置文本中提取多格式日期的通用实现
实现思路
- 先预定义所有需要支持的日期格式,指定对应Locale避免英文月份解析失败
- 用正则匹配所有可能是日期的候选文本片段,过滤无意义的字符段
- 轮询候选片段与预定义格式,能成功解析为LocalDate的即为目标日期
完整实现代码
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; public class DateExtractor { // 预定义支持的所有日期格式,常用格式可提前放到列表前面提升解析效率 private static final List<DateTimeFormatter> DATE_FORMATTERS = Arrays.asList( DateTimeFormatter.ofPattern("MMM.dd,yyyy", Locale.US), DateTimeFormatter.ofPattern("dd-MM-yyyy"), DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.US) // 新增支持格式只需在此处添加即可 ); // 匹配所有可能构成日期的字符组合(字母、数字、点、横杠、逗号) private static final Pattern DATE_CANDIDATE_PATTERN = Pattern.compile("[a-zA-Z0-9.,-]+"); public static List<LocalDate> extractDates(String input) { List<LocalDate> result = new ArrayList<>(); Matcher matcher = DATE_CANDIDATE_PATTERN.matcher(input); while (matcher.find()) { String candidate = matcher.group().trim(); for (DateTimeFormatter formatter : DATE_FORMATTERS) { try { LocalDate date = LocalDate.parse(candidate, formatter); result.add(date); // 匹配到合法格式后跳出当前候选的格式轮询 break; } catch (DateTimeParseException ignored) { // 解析失败则尝试下一个格式 } } } return result; } public static void main(String[] args) { // 测试示例输入 List<String> testInputs = Arrays.asList( "This time is Apr.19,2021 Cheers", "19-04-2021 Cheers", "This time is 19-APR-2021" ); for (String input : testInputs) { List<LocalDate> dates = extractDates(input); System.out.println("输入文本:" + input); System.out.println("提取到的日期:" + dates); } } }
说明
- 该实现支持日期出现在文本任意位置,不受前后冗余字符影响
- 新增支持的日期格式只需在
DATE_FORMATTERS列表中添加对应DateTimeFormatter即可,无需修改核心逻辑 - 若仅需提取第一个出现的日期,可在第一次解析成功后直接返回结果
- 存在格式歧义的场景(如月日顺序相反的格式)可通过调整
DATE_FORMATTERS的先后顺序适配业务需求
内容的提问来源于stack exchange,提问作者user3449580
相关产品推荐
相关产品推荐

