如果使用 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);
在 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);