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

SimpleDateFormat解析非法格式日期返回错误日期的原因及parse逻辑疑问

SimpleDateFormat 异常解析问题解答

关于'-'被当作减号的说法

这个说法属实,你的案例就是典型表现。

SimpleDateFormat.parse 的设计逻辑拆解

  1. 默认开启宽松模式
    SimpleDateFormat默认处于「宽松解析模式」,不会严格要求输入字符串和格式串完全匹配,而是会尽可能“容错”解析内容,甚至允许对日期字段的数值做偏移调整。

  2. 非数字字符的特殊处理
    对于格式串中的数字型模式(如yyyy、MM、dd这类),解析器遇到输入里的非数字字符(比如你的-、空格、:)时,在宽松模式下会把-识别为负号,将后续的数字当作负数偏移量来处理,而非格式分隔符。

  3. 无强制格式校验
    宽松模式下不会因为格式不匹配抛出异常,哪怕输入和格式串差异很大,只要能提取出可解析的数字(包括带符号的),就会自动调整日期字段,最终得到一个“合法”但完全不符合预期的日期结果。

正确的处理方式

  • 如果需要严格匹配格式,关闭宽松模式:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:32:55