DateTimeFormatter支持单个数字日期和月份

时间:2014-12-19 17:54:21

标签: java date java-8 java-time

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)));

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

什么是正确的DateTimeFormatter格式来解析每月的一位和两位数以及一年中的某个月?

2 个答案:

答案 0 :(得分:59)

来自the documentation

  

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

所以你想要的格式说明符是M/d/yyyy,使用单个字母表格。当然,对于这些日/月值,它仍会正确解析String之类的"12/30/1969",两位数字是“最小位数”。

重要的区别是MMdd要求零填充,而不是Md无法处理大于9的值(这可能会有点......不寻常)。

答案 1 :(得分:6)

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

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

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