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注解进行转换,将字符串转换为日期类型。

总结

综上所述,结合开头说的,为了前后端交互,日期字段格式统一,可以使用1、2、4三个方案。

  • 首先是GET请求,在参数少的时候,没有必要使用对象接收,就可以直接使用1方案;
  • 反之GET请求参数较多,可以使用2方案;
  • 为了和GET请求的日期统一交互格式,只能采用方案4

这里需要注意一点,GET请求封装对象内的日期字段添加的注解是@DateTimeFormat,而POST请求使用的注解是@JsonFormat

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐