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

SimpleDateFormat解析Mon 03-Mai-21报Unparsable Date错误如何解决

问题原因

你的代码存在3个核心错误导致解析失败:

  • 模式符FF使用错误:F是「当月第几个星期几」的匹配符,你要匹配2位日期数字03,应该使用dd
  • 模式符YY使用错误:大写Y对应ISO周纪年的周年,和自然年可能存在跨年偏差,匹配普通公历年的后两位需要使用小写yy
  • 区域与字符串规则不匹配:Locale.GERMAN的星期缩写规则为德语规则,周一的德语缩写是Mo,但你待解析字符串中的星期是英语缩写Mon,二者规则不兼容

解决方法

根据你的日志实际格式选择对应方案:

方案1:日志为标准德语格式(星期是德语缩写)

如果是你测试用例的星期错写为英语,修正为德语缩写即可:

DateFormat format = new SimpleDateFormat("EEE dd-MMM-yy", Locale.GERMAN);
// 德语周一缩写为Mo
String test = "Mo 03-Mai-21";
Date date = null;
try {
    date = format.parse(test);
    // 验证输出 2021-05-03
    System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));
} catch (ParseException e) {
    e.printStackTrace();
}

方案2:日志为混合格式(英语星期+德语月份)

如果日志确实是英语星期缩写+德语月份的混合格式,需要自定义日期符号映射适配:

SimpleDateFormat format = new SimpleDateFormat("EEE dd-MMM-yy", Locale.ENGLISH);
// 自定义月份缩写,加入德语五月的写法
DateFormatSymbols symbols = format.getDateFormatSymbols();
String[] shortMonths = symbols.getShortMonths();
// 月份从0开始计数,5月对应索引4
shortMonths[4] = "Mai";
symbols.setShortMonths(shortMonths);
format.setDateFormatSymbols(symbols);

String test = "Mon 03-Mai-21";
try {
    Date date = format.parse(test);
    System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));
} catch (ParseException e) {
    e.printStackTrace();
}

额外建议

如果使用JDK8及以上版本,推荐替换为java.time包下的DateTimeFormatter,该类线程安全,解析规则更严谨,避免SimpleDateFormat的多线程安全隐患。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:45:04