SimpleDateFormat无法正确解析日期:问题排查及解决方案咨询
问题分析与解决方案
兄弟,你这问题核心就是格式字符串和待解析的日期结构完全不匹配啊!
你定义的格式是MM-dd-yyyy(对应「月-日-年」的顺序),但要解析的字符串2013-12-28是「年-月-日」的结构,两者完全对不上号。而且这里还有个SimpleDateFormat的坑:它默认是宽松解析模式,有时候不会直接抛错,反而会强行“凑”出一个错误的日期(比如把2013当成月份、12当成日期、28当成年份的一部分),这反而让你误以为是其他问题。
修复步骤(基于SimpleDateFormat)
- 匹配正确的格式字符串:把
dformat改成和目标日期一致的yyyy-MM-dd - 开启严格解析模式:调用
setLenient(false),确保格式不匹配时直接抛出异常,符合你预期的报错行为
修复后的代码示例:
String dformat = "yyyy-MM-dd"; // 改成与待解析字符串匹配的格式 String cDate = "2013-12-28"; SimpleDateFormat f = new SimpleDateFormat(dformat); f.setLenient(false); // 关闭宽松解析,格式不匹配直接抛错 try { Date dd = f.parse(cDate); System.out.println(dd); } catch (ParseException e) { e.printStackTrace(); }
更优的替代方案(Java 8+)
如果你使用的是Java 8及以上版本,强烈建议抛弃老旧的SimpleDateFormat,改用java.time包下的类(线程安全、API更清晰、无隐藏坑)。示例代码如下:
String cDate = "2013-12-28"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); try { LocalDate date = LocalDate.parse(cDate, formatter); System.out.println(date); } catch (DateTimeParseException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者George Hernando
相关产品推荐
相关产品推荐

