【问题标题】:Issue with DateTimeParseException when using STRICT resolver style使用 STRICT 解析器样式时出现 DateTimeParseException 问题
【发布时间】:2017-04-27 11:33:03
【问题描述】:

我正在尝试使用以下模式解析日期字符串:yyMMddSTRICT 解析器如下:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat).withResolverStyle(ResolverStyle.STRICT);
LocalDate.parse(expiryDate, formatter);

我收到以下DateTimeParseException

java.time.format.DateTimeParseException: 文本 '160501' 不能 已解析:无法从 TemporalAccessor 获取 LocalDate: {YearOfEra=2016, MonthOfYear=5, DayOfMonth=1},ISO 类型 java.time.format.Parsed

当我切换到默认解析样式时,即ResolverStyle.SMART 它允许日期为 2 月 30 日。

有人可以帮忙吗?

【问题讨论】:

  • 我很遗憾java.time-design 不够聪明,无法认识到 - 在没有时代字段的情况下 - 时代(符号 y)应该像预测公历年(符号ü)。此外,原始的 ISO-8601 文件没有提及时代。因此,真正应该像 ISO 所说的那样处理简单的年月日组合,忽略时代并使用预测的公历。

标签: java-8 java-time


【解决方案1】:

严格的解析器需要一个时代才能与 YearOfEra 一起使用。更改您的模式以使用“u”而不是“y”,它会起作用,即。 “uuMMdd”。

【讨论】:

  • 嗨,我用uuuu 代替了yyyy,但它仍然允许02-31-2019。代码:`@FutureOrPresent @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @JsonFormat(pattern = "MM-dd-uuuu") private LocalDate start;`
  • 也用过@DateTimeFormat( iso = DateTimeFormat.ISO.DATE, pattern = "MM-dd-uuuu" )但是效果。
【解决方案2】:

虽然 JodaStephen 很好地解释了异常的原因并给出了一个很好的解决方案(使用 uu 而不是 yy),但我提供了其他几个可能的解决方案:

  1. 您可能不想要的明显的一个:将解析器样式保留为SMART(默认值)。换句话说,要么完全忽略.withResolverStyle(ResolverStyle.STRICT),要么将其更改为.withResolverStyle(ResolverStyle.SMART)
  2. 提供默认时代。

对于第二个选项,这里是一个代码示例:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("yyMMdd")
            .parseDefaulting(ChronoField.ERA, 1)
            .toFormatter()
            .withResolverStyle(ResolverStyle.STRICT);

    String expiryDate = "160501";
    LocalDate result = LocalDate.parse(expiryDate, formatter);
    
    System.out.println(result);

输出是:

2016-05-01

与在格式模式中使用 uu 相比,最后一个解决方案可能会有所不同:

  1. 它允许我们使用提供给我们的格式模式,我们无法控制是使用模式字母u 还是y
  2. 对于模式字母y,如果字符串包含负年份,它将失败并出现异常。根据您的情况和要求,这可能是可取的或不可接受的。

编辑:parseDefaulting() 的第二个参数也可以写成IsoEra.CE.getValue() 而不仅仅是1,以明确我们指定当前时代(CE;通常也称为Anno Domini 或 AD)。

【讨论】:

    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2011-06-13
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多