You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 09:18:03