GET 请求如果参数直接通过@RequestParam
接收日期,不能使用时间戳,只能用日期格式的字符串,使用@DateTimeFormat
注解转换,如”yyyy-MM-dd HH:mm:ss”。POST 接收参数使用时间戳可以直接接收,如果使用字符串,就需要使用@JsonFormat
注解进行转换。如果一个项目中有 GET 请求和 POST 请求,会出现有的请求用字符串,有的请求用时间戳,很不方便,为了统一,以下说说几种接收和转换日期的方式,超实用。
1. GET 请求,@RequestParam 接收字符串日期
@GetMapping("testDate")
public ResponseResult<?> testDate(@RequestParam("testDate")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date testDate) {
log.info("接收的日期:" + testDate);
return ResponseResult.success(testDate);
}
代码如上,需要使用@DateTimeFormat
注解,使用pattern
参数来指定转换的格式。
2. GET 请求,@ModelAttribute 接收字符串日期封装入对象
@GetMapping("testDate")
public ResponseResult<?> testDate(@ModelAttribute TestDateReqDTO reqDTO) {
log.info("接收的日期:" + reqDTO);
return ResponseResult.success(reqDTO);
}
@Data
public class TestDateReqDTO {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date testDate;
}
通过TestDateReqDTO
对象接收日期字段,这个时候同样需要使用@DateTimeFormat
注解,使用pattern
参数来指定转换的格式。这个时候虽然和 POST 请求类似,都是使用对象接收,但是无法实现时间戳自动转为日期。
3. POST 请求,@RequestBody 接收时间戳封装入对象
@PostMapping("testDate")
public ResponseResult<?> testDate(@RequestBody TestDateReqDTO reqDTO) {
log.info("接收的日期:" + reqDTO);
return ResponseResult.success(reqDTO);
}
@Data
public class TestDateReqDTO {
private Date testDate;
}
请求传入的是时间戳(毫秒),直接用对象内的日期字段接收即可,无需额外手动添加注解去转换,直接就会自动转换为日期。这种虽然方便,但是不适用于 GET 请求,很难受。
4. POST 请求,@RequestBody 接收字符串日期封装入对象
@PostMapping("testDate")
public ResponseResult<?> testDate(@RequestBody TestDateReqDTO reqDTO) {
log.info("接收的日期:" + reqDTO);
return ResponseResult.success(reqDTO);
}
@Data
public class TestDateReqDTO {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date testDate;
}
请求传入的是时间格式字符串,需要使用@JsonFormat
注解进行转换,将字符串转换为日期类型。
5. 总结
综上所述,结合开头说的,为了前后端交互,日期字段格式统一,可以使用 1、2、4 三个方案。
- 首先是 GET 请求,在参数少的时候,没有必要使用对象接收,就可以直接使用 1 方案;
- 反之 GET 请求参数较多,可以使用 2 方案;
- 为了和 GET 请求的日期统一交互格式,只能采用方案 4
这里需要注意一点,GET 请求封装对象内的日期字段添加的注解是@DateTimeFormat
,而 POST 请求使用的注解是@JsonFormat
。