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
应该可以解决问题。
四点建议:
- 您正在尝试使用 ISO 8601 格式,这是个好主意。你这样做有一个错误:ISO 8601 不接受时间和 UTC 偏移量之间的 space。我建议删除它。
- 由于您的字符串有一个 UTC 偏移量 +0000,并且没有时区,因此您不需要在 Java 中使用
ZonedDateTime
,而 OffsetDateTime
是更正确,我建议你使用。
- 您的错误的一个原因似乎是您的字符串已被 URL 解码。我不知道你的设置中这个问题的修复方法,但是要么确保字符串在源代码中被 URL 编码,以便 URL 解码恢复正确的字符串,要么避免 URL解码。
- 你的错误的另一个原因是梦のの梦在答案中已经确定的原因。您的格式模式字符串指定文字
Z
因为您已将其括在单引号中。相反,我建议在四位偏移量的格式模式中使用 xx
(如果偏移量的小时和分钟之间没有冒号)。
URL 编码,也称为百分比编码,用于对 URL 参数的字符串进行编码以适应 URL 或 URI 语法,并确保它们即使在有限的字符集。除此之外,由于不允许 URL 包含 space,URL 编码将 space 更改为 +
,一个加号。所以 URL 解码将所有加号转换回 spaces。这就是您的字符串发生的情况。只有你的加号是你的偏移量的一部分,+0000
。所以它无法再被解析。您的异常消息指的是 index 20
,这正是加号应该在的位置。
链接
我正在尝试将格式为“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
应该可以解决问题。
四点建议:
- 您正在尝试使用 ISO 8601 格式,这是个好主意。你这样做有一个错误:ISO 8601 不接受时间和 UTC 偏移量之间的 space。我建议删除它。
- 由于您的字符串有一个 UTC 偏移量 +0000,并且没有时区,因此您不需要在 Java 中使用
ZonedDateTime
,而OffsetDateTime
是更正确,我建议你使用。 - 您的错误的一个原因似乎是您的字符串已被 URL 解码。我不知道你的设置中这个问题的修复方法,但是要么确保字符串在源代码中被 URL 编码,以便 URL 解码恢复正确的字符串,要么避免 URL解码。
- 你的错误的另一个原因是梦のの梦在答案中已经确定的原因。您的格式模式字符串指定文字
Z
因为您已将其括在单引号中。相反,我建议在四位偏移量的格式模式中使用xx
(如果偏移量的小时和分钟之间没有冒号)。
URL 编码,也称为百分比编码,用于对 URL 参数的字符串进行编码以适应 URL 或 URI 语法,并确保它们即使在有限的字符集。除此之外,由于不允许 URL 包含 space,URL 编码将 space 更改为 +
,一个加号。所以 URL 解码将所有加号转换回 spaces。这就是您的字符串发生的情况。只有你的加号是你的偏移量的一部分,+0000
。所以它无法再被解析。您的异常消息指的是 index 20
,这正是加号应该在的位置。