【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-dd
与yyyy-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 |