Java 8 个日期时间解析,可选 2-4 年组件

Java 8 date-time parsing with optional 2-4 year components

我想从各种日期字符串中解析 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: Text '11-10-56' could not be parsed at index 8 ...

任何帮助将不胜感激!

不需要 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