具有可选2-4年组件的Java 8日期时间解析

时间:2018-11-21 21:18:25

标签: java datetime java-8 java-time

我想从各种日期字符串中解析LocalDate对象。所有字符串都已经具有dd-MM-yy或dd-MM-yyyy格式。在第一种情况下,基年应加19而不是20。

我有此代码,但无法正常工作。我究竟做错了什么?

        public static LocalDate parseDateString(String date) {
            DateTimeFormatter optionalFullYearParser = java.time.format.DateTimeFormatter.ofPattern("[dd-MM-yy][dd-MM-yyyy]");
            DateTimeFormatter parser = new DateTimeFormatterBuilder()
                    .appendOptional(optionalFullYearParser)
                    .appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
                    .toFormatter(new Locale ("nl","NL"));

            return java.time.LocalDate.parse(date,parser);
        }

        System.out.println(parseDateString("11-10-56").toString());
        System.out.println(parseDateString("11-10-1956").toString());
        System.out.println(parseDateString("08-05-51").toString());

当我运行此代码时,它将引发异常:

  

java.time.format.DateTimeParseException:无法在索引8处解析文本“ 11-10-56”       ...

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

不需要2个格式化程序对象来执行此操作,并且在使用appendValueReduced添加年份部分时,不应在格式文本中包含年份部分。

public static LocalDate parseDateString(String date) {
    DateTimeFormatter parser = new DateTimeFormatterBuilder()
            .appendPattern("dd-MM-")
            .appendValueReduced(ChronoField.YEAR, 2, 4, 1900)
            .toFormatter(Locale.forLanguageTag("nl-NL"));
    return java.time.LocalDate.parse(date, parser);
}

测试

System.out.println(parseDateString("11-10-56").toString());
System.out.println(parseDateString("11-10-1956").toString());
System.out.println(parseDateString("08-05-51").toString());

输出

1956-10-11
1956-10-11
1951-05-08