Java后端】@DateTimeFormat @JsonFormat 时刻格局传参总结

【Java后端】@DateTimeFormat @JsonFormat 时刻格局传参总结

1. 前言

最近在时刻Date传参时,没有加注解、前端多种格局都能够接纳到数据,从而总结一下其间的原因。

2. 介绍

2.1 无注解

Spring Boot 2.x中,当前端通过POST恳求发送一个时刻字符串”2023-06-20 21:04:50″时,后端使用Date类型来接纳,而且没有标示任何注解,依然能够接纳到数据的原因是因为Spring Boot默许使用了Jackson库进行JSON序列化和反序列化。
Jackson库内置了一些默许的日期格局:

  • ISO-8601日期格局:2023-06-20
  • 日期+时刻格局:2023-06-20T21:04:50(必须含有中间的T)
  • RFC-1123日期格局:Tue, 20 Jun 2023 21:04:50 GMT
  • 时刻戳:1564454654000
    例如:前端传2023-06-19T17:50:08,后端Date接纳即使不写注解,也是能够接到的

2.2 有注解

注解:@DateTimeFormat@JsonFormat

@DateTimeFormat注解是Spring结构供给的,用于操控日期类型属性在Spring MVC中的绑定和格局化。它的作用是将恳求参数中的日期字符串转换为Date类型,并设置到对应的实体类属性中。适用于恳求数据为非JSON数据,不会格局化回来数据
@JsonFormat注解是Jackson库供给的,用于操控日期类型属性在序列化和反序列化时的格局化。它的作用是将Java对象中的日期类型属性格局化为指定格局的字符串,在序列化为JSON字符串时输出。适用于恳求数据为JSON数据(尤其有日期数据时),且需在恳求办法的参数前加@RequestBody注解,会格局化回来数据

3. 事例

以下成果是通过封装实体进行测验的,FORM表单和JSON的差异在于加不加@RequestBody注解。

3.1 不增加注解

在JSON类型中,使用的是springboot自带的Jackson库进行JSON序列化和反序列化。
在FORM类型中,仅RFC-1123日期格局日期格局才能够成功接到参数。

类型 前端传参 注解 成果 回来值
JOSN 2023-06-19 2023-06-19T00:00:00.000+00:00
JOSN 2023-06-19T17:50:08 2023-06-19T17:50:08.000+00:00
JOSN 2023-06-19 17:50:08
JOSN Tue, 20 Jun 2023 21:04:50 GMT 2023-06-20T21:04:50.000+00:00
FORM 2023-06-19
FORM 2023-06-19T17:50:08
FORM 2023-06-19 17:50:08
FORM Tue, 20 Jun 2023 21:04:50 GMT 2023-06-20T21:04:50.000+00:00

3.2 【JSON方法】仅有@JsonFormat注解

在此种状况下,yyyy-MM-ddyyyy-MM-dd HH:mm:ss的差异能够这样了解:越短相当于约束的越少,兼容性会跟高。

前端传参 注解 成果 回来值
2023-06-19 @JsonFormat(pattern = “yyyy-MM-dd”, timezone = “GMT+8”) 2023-06-19
2023-06-19T17:50:08 @JsonFormat(pattern = “yyyy-MM-dd”, timezone = “GMT+8”) 2023-06-19
2023-06-19 17:50:08 @JsonFormat(pattern = “yyyy-MM-dd”, timezone = “GMT+8”) 2023-06-19
2023-06-19 @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”)
2023-06-19T17:50:08 @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”)
2023-06-19 17:50:08 @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”) 2023-06-19 17:50:08

3.4 【Form表单方法】仅有@DateTimeFormat注解

在此种状况下,与上述相同:越短相当于约束的越少,兼容性会跟高。

前端传参 注解 成果 回来值
2023-06-19 @DateTimeFormat(pattern = “yyyy-MM-dd”) 2023-06-18T16:00:00.000+00:00
2023-06-19T17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd”) 2023-06-18T16:00:00.000+00:00
2023-06-19 17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd”) 2023-06-18T16:00:00.000+00:00
2023-06-19 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
2023-06-19T17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
2023-06-19 17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”) 2023-06-19T09:50:08.000+00:00

4. 小结

@JsonFormat注解和@DateTimeFormat注解分别在JSON、FORM类中恳求成功的事例是相同的,差异在于@JsonFormat会对回来数据进行格局化处理。

5 其他状况

5.1 【JSON方法】仅有@DateTimeFormat注解

与3.2进行比照,恳求成功状况正好互补

前端传参 注解 成果 回来值
2023-06-19 @DateTimeFormat(pattern = “yyyy-MM-dd”) 2023-06-19T00:00:00.000+00:00
2023-06-19T17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd”) 2023-06-19T17:50:08.000+00:00
2023-06-19 17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd”)
2023-06-19 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”) 2023-06-19T00:00:00.000+00:00
2023-06-19T17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”) 2023-06-19T17:50:08.000+00:00
2023-06-19 17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)

5.2【FORM表单方法】仅有@JsonFormat注解

在这种状况,均不能恳求成功。

前端传参 注解 成果 回来值
2023-06-19 @DateTimeFormat(pattern = “yyyy-MM-dd”)
2023-06-19T17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd”)
2023-06-19 17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd”)
2023-06-19 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
2023-06-19T17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
2023-06-19 17:50:08 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)

6. 总结

之前有个说法:
@DateTimeFormat:办理输入数据格局
@JsonFormat:办理回来成果格局

经测验这个说法不完全对,@JsonFormat的确办理回来成果格局,可是输入数据格局是由两个注解相辅相成进行处理的。

主张使用时,两个注解写相同的格局化类型,兼容性如下图(两个注解都增加):

类型 前端传参 注解 成果 回来值
JSON 2023-06-19 yyyy-MM-dd 2023-06-19
JSON 2023-06-19T17:50:08 yyyy-MM-dd 2023-06-19
JSON 2023-06-19 17:50:08 yyyy-MM-dd 2023-06-19
JSON 2023-06-19 yyyy-MM-dd HH:mm:ss
JSON 2023-06-19T17:50:08 yyyy-MM-dd HH:mm:ss
JSON 2023-06-19 17:50:08 yyyy-MM-dd HH:mm:ss 2023-06-19 17:50:08
FORM 2023-06-19 yyyy-MM-dd 2023-06-19
FORM 2023-06-19T17:50:08 yyyy-MM-dd 2023-06-19
FORM 2023-06-19 17:50:08 yyyy-MM-dd 2023-06-19
FORM 2023-06-19 yyyy-MM-dd HH:mm:ss
FORM 2023-06-19T17:50:08 yyyy-MM-dd HH:mm:ss
FORM 2023-06-19 17:50:08 yyyy-MM-dd HH:mm:ss 2023-06-19 17:50:08