java.time.format.DateTimeFormatter

2026/05/04

今天在解析账单时,解析日期时突然报错,根据字符串和给定的日期格式得到了 null,因为涉及到很多种账单,发现这些账单的日期其实是不同的,有的月是 09,有的月是 9,这种两位和一位的情况比较多。

但是原先我设置的格式就是按照yyyy-MM-dd HH:mm来的,所以遇到不符合这种严格格式的日期,就解析不出来了。

我第一个想法是在 catch 语句块中去尝试第二种适配的日期格式去解析,如果还是不行,就再选一个,当然这种做饭很“丑陋”。

我之前还看到过有人是按照位置去截取,我认为这种方法会更危险。

问了下 deepseek,它回答我说

正确解析方法:使用“宽容”的模式
Java 的 DateTimeFormatter 中,单个字母 M、d、H、m 等可以接受一位或两位数字,因此直接改用模式"yyyy-M-d H:mm"即可:
java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

String str = "2025-5-21 9:25";
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-M-d H:mm");
LocalDateTime dateTime = LocalDateTime.parse(str, fmt);

System.out.println(dateTime); // 2025-05-21T09:25
说明:

* M 可匹配 5 或 05
* d 可匹配 9 或 09、21
* H 可匹配 9 或 09
* mm 固定两位分钟,所以仍用 mm

才发现原来内部还支持这样灵活的配置方式,很方便。