使用@DateTimeFormat 的日期时间解析问题
DateTime parsing issue using @DateTimeFormat
我在 SpringBootApplication
中使用 @DateTimeFormat
时遇到问题。下面是我遇到问题的代码片段`
package com.example.demo;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
public class DateTimeController {
@GetMapping("/test/datetime/{id}")
public String testDateParsing(@PathVariable String id,
@RequestParam("since") @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssz") LocalDateTime since) {
System.out.println("id : " + id);
System.out.println("since : " + since);
return "success";
}
}
该代码适用于 EST 时区的日期时间 -
http://localhost:8080/test/datetime/1?since=2021-03-02T10:57:43-05:00
- I am getting SUCCESS response for 2021-03-02T10:57:43-05:00 (EST Time)
代码是 Not Working
,IST 时区的日期时间 -
http://localhost:8080/test/datetime/1?since=2021-03-02T10:57:43+05:30
- I am getting ERROR response for 2021-03-02T10:57:43+05:30 (IST Time)
Exception -
"Failed to convert value of type 'java.lang.String' to
required type 'java.time.LocalDateTime'; nested exception is
org.springframework.core.convert.ConversionFailedException: Failed to
convert from type [java.lang.String] to type
[@org.springframework.web.bind.annotation.RequestParam
@org.springframework.format.annotation.DateTimeFormat
java.time.LocalDateTime] for value '2021-03-02T10:57:43 05:30'; nested
exception is java.lang.IllegalArgumentException: Parse attempt failed
for value [2021-03-02T10:57:43 05:30]"
知道如何解决这个问题吗?
问题是您请求中的 + 号 URL。这是保留标志。
您必须URL 对查询参数进行编码。这将看起来像这样:
GET http://localhost:8080/test/datetime/1?since=2021-03-02T10:57:43%2B05:30
您的 URL 中的加号 ("+"
) 正在自动转换为 space 字符 (" "
)。这可以通过 URL encoding 将 space 字符固定为 "%2B"
.
http://localhost:8080/test/datetime/1?since=2021-03-02T10:57:43%2B05:30
可以通过仔细阅读异常消息来确认此问题,该异常消息显示已解析的文本中包含 space,而不是加号:
Parse attempt failed for value [2021-03-02T10:57:43 05:30]"
将加号转换为 space 是 URL 中相当常见的转换,似乎 Spring 默认执行此操作。
我在 SpringBootApplication
中使用 @DateTimeFormat
时遇到问题。下面是我遇到问题的代码片段`
package com.example.demo;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
public class DateTimeController {
@GetMapping("/test/datetime/{id}")
public String testDateParsing(@PathVariable String id,
@RequestParam("since") @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssz") LocalDateTime since) {
System.out.println("id : " + id);
System.out.println("since : " + since);
return "success";
}
}
该代码适用于 EST 时区的日期时间 -
http://localhost:8080/test/datetime/1?since=2021-03-02T10:57:43-05:00
- I am getting SUCCESS response for 2021-03-02T10:57:43-05:00 (EST Time)
代码是 Not Working
,IST 时区的日期时间 -
http://localhost:8080/test/datetime/1?since=2021-03-02T10:57:43+05:30
- I am getting ERROR response for 2021-03-02T10:57:43+05:30 (IST Time)
Exception - "Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDateTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime] for value '2021-03-02T10:57:43 05:30'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2021-03-02T10:57:43 05:30]"
知道如何解决这个问题吗?
问题是您请求中的 + 号 URL。这是保留标志。
您必须URL 对查询参数进行编码。这将看起来像这样:
GET http://localhost:8080/test/datetime/1?since=2021-03-02T10:57:43%2B05:30
您的 URL 中的加号 ("+"
) 正在自动转换为 space 字符 (" "
)。这可以通过 URL encoding 将 space 字符固定为 "%2B"
.
http://localhost:8080/test/datetime/1?since=2021-03-02T10:57:43%2B05:30
可以通过仔细阅读异常消息来确认此问题,该异常消息显示已解析的文本中包含 space,而不是加号:
Parse attempt failed for value [2021-03-02T10:57:43 05:30]"
将加号转换为 space 是 URL 中相当常见的转换,似乎 Spring 默认执行此操作。