如何解决比较含法语月份字符串的日期时出现的解析错误
解决方案
核心结论
不需要手动写if判断替换法语月份,Java原生的日期格式化工具支持指定法语区域直接识别月份,比手动替换的维护成本更低、出错概率更小。
报错原因排查
你代码出现ParseException主要是两个问题导致的:
- 模式字符使用错误:
YYYY是JDK中用于表示「星期所属周年」的特殊字符,你需要匹配普通公历年,应该替换为小写的yyyy - 固定字符未转义:传入的日期字符串中月份缩写后带了
.,这个属于固定匹配字符,需要在格式化模式中用单引号包裹,否则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
相关产品推荐
相关产品推荐

