LocalDateTime.parse() 抛 DateTimeParseException 的根本原因是默认只支持 ISO_LOCAL_DATE_TIME 格式(如"2023-10-05T14:30:45"),遇空格、中文、斜杠等非ISO字符即失败;解决方法是必须显式传入与输入字符串逐字符对齐的 DateTimeFormatter,优先复用内置常量或精确手写 pattern,禁用 SimpleDateFormat。

LocalDateTime.parse() 为什么总抛 DateTimeParseException?
根本原因是 LocalDateTime.parse() 默认只认 "yyyy-MM-dd'T'HH:mm:ss" 这种 ISO_LOCAL_DATE_TIME 格式(比如 "2023-10-05T14:30:45"),遇到中文、空格、斜杠、中文“年月日”等任意非 ISO 字符,立刻报错:Text '2023-10-05 14:30:45' could not be parsed —— 注意错误里那个空格,就是罪魁祸首。
解决办法只有一个:显式传入 DateTimeFormatter。不能依赖默认解析逻辑。
- 必须用
LocalDateTime.parse(CharSequence, DateTimeFormatter)重载方法,不能只传字符串 - 不能用
DateTimeFormatter.ofPattern()随便写个 pattern 就跑,得和输入字符串**逐字符对齐**(包括空格、冒号、中英文标点) - 常见陷阱:把
"yyyy-MM-dd HH:mm:ss"写成"yyyy-MM-dd hh:mm:ss"(小写hh是 12 小时制,会把 14 解析成 2,再抛异常)
如何写一个安全可用的 DateTimeFormatter?
别手写 pattern。优先复用 JDK 内置常量,它们经过充分测试且线程安全:
- 纯数字带横线+空格+冒号 → 用
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") - 带中文“年月日时分秒” → 必须手写,例如
"yyyy年MM月dd日 HH时mm分ss秒",注意“时/分/秒”是中文,不能混用英文冒号 - 想兼容多种格式?别在一个 formatter 里塞逻辑,而是用
try-catch顺序尝试多个 formatter - 避免
new DateTimeFormatterBuilder().parseCaseInsensitive().toFormatter()这类操作——大小写不敏感对日期没意义,反而掩盖格式不匹配问题
示例:解析 "2023-10-05 14:30:45"
LocalDateTime dt = LocalDateTime.parse("2023-10-05 14:30:45",
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
为什么不用 SimpleDateFormat?
SimpleDateFormat 是老 API,非线程安全、设计反直觉、时区处理混乱。而 DateTimeFormatter 是不可变对象,可安全共享,且明确区分「本地时间」和「带时区时间」语义。
-
LocalDateTime本身不含时区,所以绝不能用DateTimeFormatter.ISO_OFFSET_DATE_TIME(它期待"2023-10-05T14:30:45+08:00"这种带偏移的字符串) - 如果原始字符串含时区信息(如
"2023-10-05 14:30:45 CST"),就该换用ZonedDateTime.parse()+ 对应 formatter,而不是硬塞给LocalDateTime - 性能上,
DateTimeFormatter预编译 pattern,比每次 newSimpleDateFormat快得多
解析失败时怎么快速定位问题?
别只看异常消息末尾的“could not be parsed”,重点看前面截取的出错位置。JDK 会标出卡在哪一个字符:
比如解析 "2023/10/05 14:30:45" 却用了 "yyyy-MM-dd HH:mm:ss",异常里会显示:Text '2023/10/05 14:30:45' could not be parsed at index 4 —— 索引 4 正好是第一个 '/',说明 pattern 期待的是 '-'。
- 用
formatter.withResolverStyle(ResolverStyle.STRICT)强制严格模式(默认就是 STRICT,但显式写出更安心) - 调试时临时加一行:
System.out.println(formatter.toString());看实际 pattern 是否和预期一致 - 输入字符串前后有空格?先
trim(),否则" 2023-10-05 14:30:45 "会因开头空格解析失败
格式对齐这事没有捷径,字符差一位,解析就崩。盯着字符串和 pattern 逐个比对,比查文档更快。










