当前位置:   article > 正文

搞懂@DateTimeFormat 注解 和 对应的时间类型_datetimefomatter date

datetimefomatter date

通常而言,前端时间控件,一般情况下直接会传一个yyyy-MM-dd的日期字符串到后台。如果我们直接用java.util.Date类型来接收,是无法获取的。这是因为Date类型默认的格式为:Tue May 16 00:00:00 CST 2023这种。

举例

  1. @ApiOperation(value = "后端不限制格式,用Date接收")
  2. @GetMapping("t111")
  3. public Result t111(
  4. @RequestParam
  5. Date date
  6. ){
  7. System.out.println(date);
  8. return Result.success(date);
  9. }

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属性来定义我们接收参数的格式规则。只要前端传递的参数符合该规则,就能被接收,否则就会报错。

  1. @ApiOperation(value = "日期_1")
  2. @GetMapping("t22")
  3. public Result t22(
  4. @RequestParam
  5. @DateTimeFormat(pattern = "yyyy-MM-dd")
  6. Date date
  7. ){
  8. System.out.println(date);
  9. return Result.success(date);
  10. }

注意:如果我们用String字符串来接收,那么@DateTimeFormat是无法限制的,因为@DateTimeFormat只对时间日期类型生效。

下面,我们再来结合不同参数类型,演示接收时间日期的效果。

代码演示

  1. package com.hssy.swaggerdemo.controller;
  2. import com.hssy.swaggerdemo.common.Result;
  3. import io.swagger.annotations.Api;
  4. import io.swagger.annotations.ApiOperation;
  5. import org.springframework.format.annotation.DateTimeFormat;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestParam;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import java.time.LocalDate;
  11. import java.time.LocalDateTime;
  12. import java.time.LocalTime;
  13. import java.util.Date;
  14. @RestController
  15. @Api(tags = "时间日期练习控制器")
  16. @RequestMapping("/dateTime")
  17. public class DateTimeController {
  18. @ApiOperation(value = "时间日期")
  19. @GetMapping("t1")
  20. public Result t1(
  21. @RequestParam
  22. @DateTimeFormat(pattern = "HH:mm:ss yyyy-MM-dd")// 限制前端传递的格式,格式必须带有日期和时间,其他可选
  23. LocalDateTime localDateTime
  24. ){
  25. System.out.println(localDateTime);
  26. return Result.success(localDateTime);
  27. }
  28. @ApiOperation(value = "日期")
  29. @GetMapping("t2")
  30. public Result t2(
  31. @RequestParam
  32. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 限制前端传递的格式,格式一定要带有日期,其他可选
  33. LocalDate localDate
  34. ){
  35. System.out.println(localDate);
  36. return Result.success(localDate);
  37. }
  38. @ApiOperation(value = "时间")
  39. @GetMapping("t3")
  40. public Result t3(
  41. @RequestParam
  42. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 限制前端传递的格式,格式一定要带有时间,其他可选
  43. LocalTime localTime
  44. ){
  45. System.out.println(localTime);
  46. return Result.success(localTime);
  47. }
  48. @ApiOperation(value = "时间日期_1")
  49. @GetMapping("t11")
  50. public Result t11(
  51. @RequestParam
  52. @DateTimeFormat(pattern = "HH:mm:ss yyyy-MM-dd")
  53. Date date
  54. ){
  55. System.out.println(date);
  56. return Result.success(date);
  57. }
  58. @ApiOperation(value = "日期_1")
  59. @GetMapping("t22")
  60. public Result t22(
  61. @RequestParam
  62. @DateTimeFormat(pattern = "yyyy-MM-dd")
  63. Date date
  64. ){
  65. System.out.println(date);
  66. return Result.success(date);
  67. }
  68. @ApiOperation(value = "时间_1")
  69. @GetMapping("t33")
  70. public Result t33(
  71. @RequestParam
  72. @DateTimeFormat(pattern = "HH:mm:ss")
  73. Date date
  74. ){
  75. System.out.println(date);
  76. return Result.success(date);
  77. }
  78. }

总结

@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的格式必须包含时间,其他可选。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/692636
推荐阅读
相关标签
  

闽ICP备14008679号