Java 8 如果使用appendValueReduced,DateTimeFormatterBuilder解析天数低于31天SMART不严格

Java 8 如果使用appendValueReduced,DateTimeFormatterBuilder解析天数低于31天SMART不严格,java-8,datetime-format,groovy-console,Java 8,Datetime Format,Groovy Console,使用DateTimeFormatter和DateTimeFormatterBuilder在groovyConsole中玩 String inputDateString = "31.2.58" // german date format dtfIn = DateTimeFormatter .ofPattern ( "d.M.uu" ) .withResolverStyle ( ResolverStyle.STRICT ) dtfIn.parse(inputDat

使用DateTimeFormatter和DateTimeFormatterBuilder在groovyConsole中玩

String inputDateString = "31.2.58" // german date format

dtfIn = DateTimeFormatter
        .ofPattern ( "d.M.uu" )
        .withResolverStyle ( ResolverStyle.STRICT )

dtfIn.parse(inputDateString) // ERROR as expected
……但是

// with base range 1937-2034
dtfIn = new DateTimeFormatterBuilder()
       .appendPattern("d.M.")
       .appendValueReduced(ChronoField.YEAR, 2, 2, Year.now().getValue() - 80)
       .parseStrict()
       .toFormatter()

dtfIn.parse(inputDateString) // Result: 1958-02-28
因此,带有.parseStrict()的DateTimeFormatterBuilder将进行相当智能的解析,DateTimeFormatterBuilder除了严格或宽松(?)之外根本不应该这样做

如果日数超过31,我会出错

问题似乎是。appendValueReduced()。没有它,我会像预期的那样成为一个错误

我做错了什么

谢谢


来自
DateTimeFormatterBuilder.toFormatter()
的Rawi

DateTimeFormatter
确实很聪明,因为:

解析器样式将是智能的

要获得严格的解析,必须使用
DateFormatter.withResolverStyle(ResolverStyle)
在这种情况下,如下所示:

.toFormatter().withResolverStyle(ResolverStyle.STRICT);

DateTimeFormatterBuilder.toFormatter()
DateTimeFormatter
确实很聪明,因为:

解析器样式将是智能的

要获得严格的解析,必须使用
DateFormatter.withResolverStyle(ResolverStyle)
在这种情况下,如下所示:

.toFormatter().withResolverStyle(ResolverStyle.STRICT);

谢谢Mikko。是的,这样工作正常。请解释一下,为什么方法.parseStrict()没有帮助?我想它会告诉DateTimeFormatterBuilder这样做..parseStrict()不起作用,因为toFormatter()忽略以前的设置值并使用自己的(SMART)。谢谢Mikko。是的,这样工作正常。请解释一下,为什么方法.parseStrict()没有帮助?我想它会告诉DateTimeFormatterBuilder这样做..parseStrict()不起作用,因为toFormatter()忽略以前的设置值并使用他自己的(SMART)。