Java中格式化与解析同一日期得到不同结果是什么原因
问题原因
SimpleDateFormat默认开启宽松解析模式,不会严格校验日期字段的合法性,超出范围的字段会自动换算为等效的合法日期,不会直接抛出解析异常。- 你传入的日期字符串
"10/21/2021"按dd/MM/yyyy格式解析时,会被拆分出三个字段:日=10,月=21,年=2021。月份21超出了1~12的合法范围,会被自动换算:21个月 = 1年 + 9个月,因此年份从2021加1变为2022,剩余月份为9,最终得到合法日期2022年9月10日,格式化后就是你控制台输出的"10/09/2022"。
解决方案
如果需要严格校验日期合法性,不符合格式要求就抛出ParseException,手动关闭宽松解析即可:
String sFecha = "10/21/2021"; try { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); // 关闭宽松解析,开启严格校验 sdf.setLenient(false); System.out.println(sdf.format(sdf.parse(sFecha))); } catch (java.text.ParseException e) { // 此时会进入异常分支,符合你的预期 e.printStackTrace(); }
补充说明:Java 8及更高版本更推荐使用
java.time包下的DateTimeFormatter替代SimpleDateFormat,前者默认就是严格解析模式,不存在自动换算的问题,同时是线程安全的,适合多线程场景使用。
内容的提问来源于stack exchange,提问作者David Peláez
相关产品推荐
相关产品推荐

