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

Java DateTimeFormatter配合LocalDateTime.parse解析日期索引4报错问题

问题原因

首先解释报错含义:java.time.format.DateTimeParseException: Text '15. jun 2022 19:51' could not be parsed at index 4 指字符串解析到从0开始计数的第4位时匹配失败,对应你传入的字符串,第4位正好是月份字段的首字符j,说明格式化器在该位置没有识别到符合规则的月份值。

核心故障点有两个:

  • Locale配置错误:你使用的Locale.forLanguageTag("no")无法正确加载挪威语的日期格式化资源。Java的挪威语本地化资源按nb(书面挪威语Bokmål,挪威主流书面标准)、nn(新挪威语Nynorsk)两个标签区分,没有为通用标签no提供配套资源,这种情况下格式化器会回退到JVM默认Locale(比如中文、英文环境),自然无法识别挪威语的月份缩写jun。
  • 网页空白字符隐患:从HTML元素抓取的文本很可能包含非ASCII空白字符(比如前端 生成的不间断空格U+00A0、零宽空格等),你写的模式里用的是普通ASCII空格,会出现空格匹配失败、解析位置错位的问题。

另外你提到的原有代码逻辑作用:

  • replaceAll("(?<=[A-Za-z]{3})[.a-z]{1,2}", "") 是为了统一月份格式:挪威语月份缩写有时会带尾点(比如jun.),有时会返回4个字母的短全拼(比如六月juni),这个正则会把三个字母月份名后面多出来的点、1-2个小写字母删掉,统一成三个字母的缩写。
  • 开头的if判断是给个位数日期补前导零,比如3. jun 2022会被补成03. jun 2022,匹配dd要求的两位日期格式。
修复方案
  1. 修正Locale配置,把格式化器的Locale改成正确的书面挪威语标签,替换parseDatoLocalDateTime方法里的对应行:
    // 原代码是Locale.forLanguageTag("no")
    .toFormatter(Locale.forLanguageTag("nb-NO"));
    
    如果仍有兼容问题,可以用构造方法明确指定国家地区:
    .toFormatter(new Locale("nb", "NO"));
    
  2. 对抓取到的文本做空白归一化处理,避免网页特殊字符干扰解析,修改getDateForIception里的字符串处理逻辑:
    String tid = driver.findElement(By.cssSelector("div.hendelse-tid.hb-tekst--ingenBryting"))
        .getText()
        // 把所有类型的空白字符替换为普通ASCII空格,去除首尾空白
        .replaceAll("\\s+", " ")
        .trim()
        // 保留原有月份格式统一逻辑
        .replaceAll("(?<=[A-Za-z]{3})[.a-z]{1,2}", "");
    
  3. (可选调试步骤)如果修改后仍报错,可以加调试代码打印当前Locale下的所有短月份缩写,确认格式匹配:
    for (Month month : Month.values()) {
        System.out.println(month.getDisplayName(TextStyle.SHORT, Locale.forLanguageTag("nb-NO")));
    }
    
    正常JDK环境下六月的短缩写就是jun,和你抓取到的文本完全一致,修改后即可正常解析。

内容的提问来源于stack exchange,提问作者user9347168

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:27:17