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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:52:26