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

Simple Date Format日期解析报错,请求排查原因

解决SimpleDateFormat解析失败的问题

我来帮你排查这个日期解析的问题,你的代码里有几个关键的地方导致了错误:

错误原因分析

  • 缺少前导零的问题:你手动拼接日期字符串的时候,当月份、日期、小时或分钟的数值小于10时,会生成单数字的字符串(比如1月变成1而不是01,9分钟变成9而不是09),但你的SimpleDateFormat格式是yyyy-MM-dd hh:mm,要求月份、日期、小时、分钟都是两位数字,这种格式不匹配会直接触发解析错误。
  • 12小时制与24小时制混淆:你用了hh作为小时格式符,这代表12小时制的小时(范围1-12),但你通过realtimeDeparture / 3600计算出来的是24小时制的小时值(比如13点、20点),用hh解析超过12的小时数肯定会失败,应该用HH(24小时制格式符)。
  • 冗余的解析步骤:其实你已经拿到了Calendar实例,完全可以直接通过Calendar设置时分,不需要手动拼接字符串再解析,这既容易出错又没必要。

修正后的代码方案

方案1:修复拼接逻辑和格式符

如果你坚持要保留手动拼接的方式,需要补全前导零,同时替换正确的格式符:

if (realtimeDeparture != null) { 
    int hours = this.realtimeDeparture / 3600; 
    int minutes = (this.realtimeDeparture % 3600) / 60; 
    // 用HH表示24小时制,匹配计算出的小时值
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
    try { 
        Calendar cal = Calendar.getInstance(Locale.FRENCH); 
        // 用String.format自动补全前导零,确保格式符合要求
        String date = String.format("%d-%02d-%02d %02d:%02d",
                cal.get(Calendar.YEAR),
                cal.get(Calendar.MONTH) + 1,
                cal.get(Calendar.DAY_OF_MONTH),
                hours,
                minutes);
        result = df.parse(date); 
    } catch (ParseException e) {
        // 别忘了捕获异常并做相应处理
        e.printStackTrace();
    }
}

方案2:更优雅的方式(推荐)

直接使用Calendar来设置时间,避免字符串拼接和解析的步骤,既高效又不容易出错:

if (realtimeDeparture != null) { 
    int hours = this.realtimeDeparture / 3600; 
    int minutes = (this.realtimeDeparture % 3600) / 60; 
    try { 
        Calendar cal = Calendar.getInstance(Locale.FRENCH);
        // 直接设置时分,保留当前的年月日
        cal.set(Calendar.HOUR_OF_DAY, hours);
        cal.set(Calendar.MINUTE, minutes);
        // 直接获取Date对象,无需解析字符串
        result = cal.getTime();
        // 如果需要格式化输出字符串,再调用SimpleDateFormat
        // SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        // String formattedDate = df.format(result);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

另外补充一点:SimpleDateFormat是线程不安全的,如果你在多线程环境下使用,建议改用Java 8+的DateTimeFormatter(属于java.time包),它是线程安全的,API设计也更简洁直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:51:17