java DateTimeFormatter支持一位数的日和月

n8ghc7c1  于 2022-12-28  发布在  Java
关注(0)|答案(4)|浏览(272)

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来解析一位数和两位数的日期和月份?

wz3gfoph

wz3gfoph1#

private final static DateTimeFormatter BIRTH_DAY_FORMATTER = DateTimeFormatter.ofPattern("yyyy-M-d");

public static LocalDate convertDate(String dateString) {
    return LocalDate.parse(dateString, BIRTH_DAY_FORMATTER);
}

您可以在Utils类中使用这种方法,并且由于DateTimeFormatter是线程安全的,因此可以将其用作Utils类中的字段

vmdwslir

vmdwslir2#

the documentation开始:

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

所以你需要的格式说明符是M/d/yyyy,使用单字母形式。当然,它仍然会像"12/30/1969"一样正确地解析日期String,因为对于这些天/月值,两位数是"最小位数"。
重要的区别在于MMdd需要补零,而不是Md不能处理大于9的值(这有点......不寻常)。

3gtaxfhh

3gtaxfhh3#

在Java 8日期时间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));
yacmzcpb

yacmzcpb4#

处理这类问题的最佳方法,即日期(日,月或年)中不同数字的数量是使用这种模式:* *(月日)**。
示例:

String date = "7/7/2021"; // or "07/07/2021" or "07/7/21" etc
LocalDate localDate = LocalDate.parse(
date,DateTimeFormatter.ofPattern("M/d/[uuuu][uu]"));

此处uuuu/uu处理四位数和两位数的年份。

相关问题