Java 8 DateTimeFormatter两位数18年解析为0018而不是2018年?

时间:2018-01-08 18:26:58

标签: java-8 date-format java-time date-parsing

使用Java 8,下面的代码解析" 18"进入一年" 0018"而不是" 2018"。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/y");
return LocalDate.parse(date, formatter);

输入日期为" 01/05/18"。

1)为什么结果是" 0018"? DateTimeFormatter不遵循80-20规则吗?

2)How to control SimpleDateFormat parse to 19xx or 20xx?谈到SimpleDateFormat.set2DigitYearStart(Date)可以用来修复这一年。是否有类似DateTimeFormatter的内容?

我希望" M / d / y"将解析2到4位数年份。

" M / d / yy的"抛出4位数的异常并解析" 01/05/97"到" 2097-01-05"。理想情况下,这应解析为" 1997-01-05"。

" M / d / yyyy的"抛出2位数的异常。

2 个答案:

答案 0 :(得分:13)

没有一个yu字符串可以解析两位和四位数年份。但是,您可以使用格式模式字符串中的可选部分来指定可能存在两位或四位数年份:

public static LocalDate parseDateString(CharSequence date) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/[uuuu][uu]");
    return LocalDate.parse(date, formatter);
}

试一试:

    System.out.println(parseDateString("01/05/18"));
    System.out.println(parseDateString("01/06/2018"));

打印出来:

2018-01-05
2018-01-06

在格式模式字符串中,您需要将四位数年份放在第一位。使用相反的顺序,当尝试解析四位数年份时,格式化程序将解析两个数字,确定它是否成功到目前为止,然后在两位数字之后抱怨未解析的文本。

如果您想要更精确地控制两位数年份的解释:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("M/d/")
            .optionalStart()
            .appendPattern("uuuu")
            .optionalEnd()
            .optionalStart()
            .appendValueReduced(ChronoField.YEAR, 2, 2, 1920)
            .optionalEnd()
            .toFormatter();

在上面的方法中使用这个格式化器让我们试试:

    System.out.println(parseDateString("01/05/22"));

打印:

1922-01-05

以1920为基础(如我的示例代码中所示)将导致两位数的年份在1920年到2019年的间隔内结束。根据您的要求调整值。

答案 1 :(得分:0)

将Formatter字符串更改为     “M / d / yy的”