通常而言,前端时间控件,一般情况下直接会传一个yyyy-MM-dd的日期字符串到后台。如果我们直接用java.util.Date类型来接收,是无法获取的。这是因为Date类型默认的格式为:Tue May 16 00:00:00 CST 2023这种。
举例
@ApiOperation(value = "后端不限制格式,用Date接收")
@GetMapping("t111")
public Result t111(
@RequestParam
Date date
){
System.out.println(date);
return Result.success(date);
}
2023-05-16 23:53:54.053 WARN 7844 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam java.util.Date] for value '2023-05-16'; nested exception is java.lang.IllegalArgumentException]
但是如果按Date的默认格式传递就ok。
要想解决这个问题,那么我们就需要在接收参数上使用到@DateTimeFormat注解。然后pattern属性来定义我们接收参数的格式规则。只要前端传递的参数符合该规则,就能被接收,否则就会报错。
@ApiOperation(value = "日期_1")
@GetMapping("t22")
public Result t22(
@RequestParam
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date date
){
System.out.println(date);
return Result.success(date);
}
注意:如果我们用String字符串来接收,那么@DateTimeFormat是无法限制的,因为@DateTimeFormat只对时间日期类型生效。
下面,我们再来结合不同参数类型,演示接收时间日期的效果。
代码演示
package com.hssy.swaggerdemo.controller;
import com.hssy.swaggerdemo.common.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;
@RestController
@Api(tags = "时间日期练习控制器")
@RequestMapping("/dateTime")
public class DateTimeController {
@ApiOperation(value = "时间日期")
@GetMapping("t1")
public Result t1(
@RequestParam
@DateTimeFormat(pattern = "HH:mm:ss yyyy-MM-dd")// 限制前端传递的格式,格式必须带有日期和时间,其他可选
LocalDateTime localDateTime
){
System.out.println(localDateTime);
return Result.success(localDateTime);
}
@ApiOperation(value = "日期")
@GetMapping("t2")
public Result t2(
@RequestParam
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 限制前端传递的格式,格式一定要带有日期,其他可选
LocalDate localDate
){
System.out.println(localDate);
return Result.success(localDate);
}
@ApiOperation(value = "时间")
@GetMapping("t3")
public Result t3(
@RequestParam
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 限制前端传递的格式,格式一定要带有时间,其他可选
LocalTime localTime
){
System.out.println(localTime);
return Result.success(localTime);
}
@ApiOperation(value = "时间日期_1")
@GetMapping("t11")
public Result t11(
@RequestParam
@DateTimeFormat(pattern = "HH:mm:ss yyyy-MM-dd")
Date date
){
System.out.println(date);
return Result.success(date);
}
@ApiOperation(value = "日期_1")
@GetMapping("t22")
public Result t22(
@RequestParam
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date date
){
System.out.println(date);
return Result.success(date);
}
@ApiOperation(value = "时间_1")
@GetMapping("t33")
public Result t33(
@RequestParam
@DateTimeFormat(pattern = "HH:mm:ss")
Date date
){
System.out.println(date);
return Result.success(date);
}
}
总结
@DateTimeFormat 用来规定前端传递的时间日期的格式。
@DateTimeFormat 注解的pattern规则,规定了前端传递是参数必须符合该规则,否则报错。
当使用java.util.Date类型接收参数时,无论@DateTimeFormat的格式是只带有时间还是只带有日 期,或者都带有,Date对象都能够解析到。遇到没有传递的部分会自动解析为默认值。
比如: 如果格式要求 yyyy-MM-dd,那么时间默认解析为 00:00:00
如果格式要求 HH:mm:ss,那么日期默认解析为 1970-01-01
当使用java.time.LocalDateTime接收参数时,@DateTimeFormat的格式必须带有时间和日期,否则无法解析到。
当使用java.time.LocalDate接收参数时,@DateTimeFormat的格式必须包含日期,其他可选。
当使用java.time.LocalTime接收参数时,@DateTimeFormat的格式必须包含时间,其他可选。