SimpleDateFormat解析非法格式日期返回错误日期的原因及parse逻辑疑问
SimpleDateFormat 异常解析问题解答
关于'-'被当作减号的说法
这个说法属实,你的案例就是典型表现。
SimpleDateFormat.parse 的设计逻辑拆解
默认开启宽松模式
SimpleDateFormat默认处于「宽松解析模式」,不会严格要求输入字符串和格式串完全匹配,而是会尽可能“容错”解析内容,甚至允许对日期字段的数值做偏移调整。非数字字符的特殊处理
对于格式串中的数字型模式(如yyyy、MM、dd这类),解析器遇到输入里的非数字字符(比如你的-、空格、:)时,在宽松模式下会把-识别为负号,将后续的数字当作负数偏移量来处理,而非格式分隔符。无强制格式校验
宽松模式下不会因为格式不匹配抛出异常,哪怕输入和格式串差异很大,只要能提取出可解析的数字(包括带符号的),就会自动调整日期字段,最终得到一个“合法”但完全不符合预期的日期结果。
正确的处理方式
- 如果需要严格匹配格式,关闭宽松模式:
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); format.setLenient(false); // 开启严格模式 Date date = format.parse("2024-03-01 09:20:46"); // 此时会直接抛出ParseException - 推荐使用Java 8及以上版本的
java.time工具类(如DateTimeFormatter、LocalDateTime),这类API默认是严格模式,解析逻辑更清晰,也更不易出错。
内容的提问来源于stack exchange,提问作者yifu_yang
相关产品推荐
相关产品推荐

