使用SimpleDateFormat解析德语星期缩写时出现ParseException问题
问题原因与解决方案
你碰到的这个ParseException问题,核心是两种API对德语星期缩写的格式定义不匹配:
- 你用
DayOfWeek.getDisplayName(TextStyle.SHORT_STANDALONE, Locale.GERMANY)生成的是独立式短缩写——也就是不带句点的Mo、Di、Mi这类; - 但
SimpleDateFormat的EEE模式,在德语Locale下对应的是关联式短缩写——也就是带句点的Mo.、Di.版本。
这就导致你用不带点的字符串去匹配带点的解析规则,自然会抛出解析异常。
推荐解决方案:使用Java 8+的java.time API
SimpleDateFormat是旧API,不仅线程不安全,还存在不少设计缺陷,建议直接切换到Java 8引入的java.time包(JSR-310)来处理日期解析。下面是适配你需求的解析代码:
private static int parseDayOfWeek(String day) { // "ccc" 模式对应独立式短星期名称,正好匹配你生成的不带点缩写 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ccc", Locale.GERMANY); DayOfWeek dayOfWeek = DayOfWeek.from(formatter.parse(day)); // 如果你需要和原Calendar.DAY_OF_WEEK的返回值一致(1=周日,2=周一...7=周六),用下面的转换 // return dayOfWeek.getValue() % 7 + 1; // DayOfWeek本身的getValue()返回1=周一,7=周日,更符合国际标准 return dayOfWeek.getValue(); }
兼容旧API的临时方案
如果因为项目限制必须用SimpleDateFormat,可以先给输入的星期缩写补上句点,再进行解析:
private static int parseDayOfWeek(String day) { // 给不带句点的缩写添加句点,匹配SimpleDateFormat的EEE规则 String dayWithDot = day + "."; SimpleDateFormat dayFormat = new SimpleDateFormat("EEE", Locale.GERMANY); Date date = null; try { date = dayFormat.parse(dayWithDot); } catch (ParseException e) { e.printStackTrace(); } if (date == null) { return -1; // 处理解析失败的边界情况 } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.DAY_OF_WEEK); }
内容的提问来源于stack exchange,提问作者Dawid
相关产品推荐
相关产品推荐

