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
相关产品推荐
相关产品推荐

