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

