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

如何解决比较含法语月份字符串的日期时出现的解析错误

解决方案

核心结论

不需要手动写if判断替换法语月份,Java原生的日期格式化工具支持指定法语区域直接识别月份,比手动替换的维护成本更低、出错概率更小。

报错原因排查

你代码出现ParseException主要是两个问题导致的:

  1. 模式字符使用错误:YYYY是JDK中用于表示「星期所属周年」的特殊字符,你需要匹配普通公历年,应该替换为小写的yyyy
  2. 固定字符未转义:传入的日期字符串中月份缩写后带了.,这个属于固定匹配字符,需要在格式化模式中用单引号包裹,否则MMM会尝试把点也纳入月份匹配,而法语Locale下的默认月份缩写不带点,直接匹配会失败

修复方案

方案1:修改原有SimpleDateFormat代码

调整模式字符串即可正常解析,修改后代码如下:

String target1 = "17 oct. 2019 (08:23)";
String target2 = "19 déc. 2019 (21:15)";
// 注意:把月份后的.用单引号转义,YYYY改为yyyy
DateFormat df = new SimpleDateFormat("dd MMM'.' yyyy (kk:mm)", Locale.FRENCH);
// 开启宽松解析提升兼容性,可根据需求选择是否开启
df.setLenient(true);
Date result =  df.parse(target1);
Date result2 =  df.parse(target2);
System.out.println(result);
System.out.println(result2);
System.out.println(result.compareTo(result2) < 0); // 第一个日期更早,输出true

方案2(推荐):使用Java 8+ 新日期API

旧的Date和SimpleDateFormat存在线程安全、设计不规范的问题,Java 8之后引入的java.time包更安全易用,实现代码如下:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class DateCompare {
    public static void main(String[] args) {
        String target1 = "17 oct. 2019 (08:23)";
        String target2 = "19 déc. 2019 (21:15)";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM'.' yyyy (HH:mm)", Locale.FRENCH);
        LocalDateTime dt1 = LocalDateTime.parse(target1, formatter);
        LocalDateTime dt2 = LocalDateTime.parse(target2, formatter);
        // 直接调用isBefore/isAfter判断大小,语义更清晰
        System.out.println(dt1.isBefore(dt2)); // 输出true
    }
}

额外注意事项

如果你的输入中存在月份首字母大写的情况(比如Oct.),可以在解析前先调用toLowerCase()把字符串转为全小写,避免大小写不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:06:02