如果使用 appendValueReduced,DateTimeFormatterBuilder 解析天数低于 31 SMART 不是 STRICT

DateTimeFormatterBuilder parsing days below 31 SMART not STRICT if appendValueReduced is used

在 groovyConsole 中玩 DateTimeFormatter 和 DateTimeFormatterBuilder

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 会解析相当 SMART,而 DateTimeFormatterBuilder 根本不应该这样做,而是 STRICT 或 LENIENT (?)'

天数超过 31 时会出现错误。

问题似乎出在 .appendValueReduced() 上。 没有它我会如预期的那样成为一个错误。

我做错了什么?

谢谢

拉维

来自 DateTimeFormatterBuilder.toFormatter()

DateTimeFormatter 确实和 documented 一样聪明:

The resolver style will be SMART

要获得 STRICT,必须使用 DateFormatter.withResolverStyle(ResolverStyle) 在这种情况下如下:

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