日期时间格式化程序支持个位数的月份和月份

2022-08-31 14:10:29

DateTimeFormmater似乎无法处理该月的个位数日期:

String format = "MM/dd/yyyy";
String date   = "5/3/1969";
System.out.println(new SimpleDateFormat(format).parse(date));
System.out.println(LocalDate.parse(date, DateTimeFormatter.ofPattern(format)));

在此示例中,正确分析日期,但引发异常。如果我使用零填充日期,例如,“05/03/1969”,两者都有效。但是,如果月中的某一天或一年中的某一月是个位数,则引发异常。SimpleDateFormatDateTimeFormatterDateTimeFormatter

解析一位数和两位数月份和一年中的月份的正确格式是什么?DateTimeFormatter


答案 1

文档中

数字:如果字母计数为 1,则使用最小位数输出该值,并且不带填充。

因此,您需要的格式说明符是 ,使用单个字母形式。当然,它仍然会像这些日/月值一样正确解析日期,两位数是“最小位数”。M/d/yyyyString"12/30/1969"

重要的区别在于,并且需要零填充,而不是那个,并且不能处理大于9的值(那会有点......不寻常)。MMddMd


答案 2

在Java 8 Date Time API中,我最近使用了

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendOptional(DateTimeFormatter.ofPattern("M/dd/yyyy"))
            .toFormatter();

System.out.println(LocalDate.parse("10/22/2020", formatter));
System.out.println(LocalDate.parse("2/21/2020", formatter));