没有分隔符的本地日期解析不起作用

Tho*_*rro 4 java datetime-format java-8 java-date

我有一个日期格式如下:

四位数的年份,然后是两位数的周数.

例如,2018年的第四周将是20 1804年.

我在使用Java 8的LocalDateDateTimeFormatterBuilder解析这些日期时遇到了麻烦.

以下是我尝试解析日期的方法:

LocalDate.parse(
    "201804",
    new DateTimeFormatterBuilder().appendPattern("YYYYww").parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
);
Run Code Online (Sandbox Code Playgroud)

执行会抛出以下异常:

java.time.format.DateTimeParseException:无法在索引0处解析文本"201804"

奇怪的是,当我在日期部分之间添加一个分隔符时,不再抛出异常:

LocalDate.parse(
    "2018 04",
    new DateTimeFormatterBuilder().appendPattern("YYYY ww").parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
);
Run Code Online (Sandbox Code Playgroud)

结果是 :

2018年1月22日

格式化板是否缺少一些东西?

Era*_*ran 5

您可以使用 appendValue

此方法支持一种称为"相邻值解析"的特殊解析技术.该技术解决了值,可变或固定宽度后跟一个或多个固定长度值的问题.标准解析器是贪婪的,因此它通常会窃取固定宽度值解析器所需的数字,这些解析器遵循可变宽度1.

无需任何操作即可启动"相邻值解析".当调用appendValue时,构建器进入相邻值解析设置模式.

这样可行:

LocalDate.parse(
                "201804",
                new DateTimeFormatterBuilder()
                        .appendValue(YEAR, 4)
                        .appendValue(ALIGNED_WEEK_OF_YEAR, 2)
                        .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
        );
Run Code Online (Sandbox Code Playgroud)