Spring 在请求参数中传递格式 (yyyy-MM-dd'T'HH:mm:ss Z) 的时间时启动错误

Spring boot error while passing time of format (yyyy-MM-dd'T'HH:mm:ss Z) in request parameter

我正在尝试将格式为“2020-02-26T11:02:41 +0000”的分区日期时间作为请求参数传递给我的 spring 启动控制器。

  public ResponseEntity<?> getStatistics(
  @ApiParam(value = "startDate", example = "2020-02-26T11:02:41 +0000")
  @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss 'Z'") @RequestParam(value = "startDate",
      required = false) ZonedDateTime startDate)

我在点击 api

时收到此异常
Caused by: java.lang.IllegalArgumentException: Parse attempt failed for value [2020-02-26T11:02:41  0000]
at org.springframework.format.support.FormattingConversionService$ParserConverter.convert(FormattingConversionService.java:206)
at org.springframework.format.support.FormattingConversionService$AnnotationParserConverter.convert(FormattingConversionService.java:321)
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:40)


Caused by: java.time.format.DateTimeParseException: Text '2020-02-26T11:02:41  0000' could not be parsed at index 20
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)

我到底错过了什么?似乎 spring 无法将字符串解析为 datetime

您正在传递文字 'Z' 作为区域偏移量。 更改为 yyyy-MM-dd'T'HH:mm:ssZ 然后传入 2020-02-26T11:02:41+0000 应该可以解决问题。

四点建议:

  1. 您正在尝试使用 ISO 8601 格式,这是个好主意。你这样做有一个错误:ISO 8601 不接受时间和 UTC 偏移量之间的 space。我建议删除它。
  2. 由于您的字符串有一个 UTC 偏移量 +0000,并且没有时区,因此您不需要在 Java 中使用 ZonedDateTime,而 OffsetDateTime 是更正确,我建议你使用。
  3. 您的错误的一个原因似乎是您的字符串已被 URL 解码。我不知道你的设置中这个问题的修复方法,但是要么确保字符串在源代码中被 URL 编码,以便 URL 解码恢复正确的字符串,要么避免 URL解码。
  4. 你的错误的另一个原因是梦のの梦在答案中已经确定的原因。您的格式模式字符串指定文字 Z 因为您已将其括在单引号中。相反,我建议在四位偏移量的格式模式中使用 xx(如果偏移量的小时和分钟之间没有冒号)。

URL 编码,也称为百分比编码,用于对 URL 参数的字符串进行编码以适应 URL 或 URI 语法,并确保它们即使在有限的字符集。除此之外,由于不允许 URL 包含 space,URL 编码将 space 更改为 +,一个加号。所以 URL 解码将所有加号转换回 spaces。这就是您的字符串发生的情况。只有你的加号是你的偏移量的一部分,+0000。所以它无法再被解析。您的异常消息指的是 index 20,这正是加号应该在的位置。

链接