前言
博主在学习的过程中,发现网上对于 @DateTimeFormat
和@JsonFormat
都是千篇一律且以偏概全的解释:
@DateTimeFormat
用于前端传给后端的时间格式转换@JsonFormat
用于后端传给前端的时间格式转换
加上博主之前所使用的 Jeecg
框架也是在时间属性上同时加了这两个注解。导致博主在一段时间内对这个解释深信不疑!知道前不久遇到了一个 Bug 后,我才发现网上千篇一律且以偏概全的荒谬理论真的是误人子弟!下面,博主将自己学习理解的见解分享给大家😀
@JsonFormat 注解
出处:com.fasterxml.jackson.annotation.JsonFormat
作用:将日期类型数据在 JSON 格式和 java.util.Date 对象之间转换。约束时间的接收格式和响应格式 (接收和响应的都是JSON字符串) 。与传输方向没有关系(前端到后端 OR 后端到前端都可以使用)
常用属性:
属性名 | 作用 |
pattern | 设置时间格式。 eg: 建议配合 Hutool 的
|
timezone | 指定具体时区。 eg: |
注意:因为我们是东八区(北京时间),使用时需要加上时区属性( timezone = "GMT+8"),不然所得值会比实际时间晚8小时;
举例:
@Data
public class pojo {
@JsonFormat(pattern = "yyyy-MM-dd hh", timezone = "GMT+8")
private Date date;
}
@DateTimeFormat 注解
出处:org.springframework.format.annotation.DateTimeFormat
作用:主要对 Date、Calendar、Long 及 Joda 时间类型的属性进行格式化处理,主要处理前端时间类型与后端 POJO 对象中的成员变量进行数据绑定。所约束的时间格式并不会影响后端返回前端的时间类型数据格式
常用属性:
属性名 | 作用 |
iso | 类型为
|
pattern | 类型为 String,使用自定义时间格式化字符串,如 yyyy-MM-dd hh:mm:ss |
style | 类型为 String,通过样式指定日期时间的格式,由两位字符组成, 第一位表示日期的样式,第二位表示时间的格式,以下是几个常用的可选值: S:短日期/时间的样式 M:中日期/时间的样式 L:短日期/时间的样式 F:完整日期/时间的样子 -:忽略日期或时间的样式 默认值 style=“SS” |
注意:前端入参数据的时间格式必须与注解中定义的时间格式相同
举例:
@Data
public class query {
@DateTimeFormat(pattern = "yyyy-MM-dd hh")
private Date date;
}
总结
⭐@JsonFormat
和 @DateTimeFormat
的区别:
- @JsonFormat 既可以约束前端传入的时间类型参数格式,也可以约束后端响应给前端的时间类型格式;与请求的数据类型有关,必须为 JSON 类型!
- 目前大部分 Java 项目都是使用 JSON 的方式传输前后端数据(即前端使用 JSON 提交,后端使用 @RequestBody 注解接收参数的形式),使用 @JsonFormat 单一注解即可。
- @DateTimeFormat 只能约束前端传入的时间类型参数格式,且如果单独使用 @DateTimeFormat 时,响应给前端的时间会比实际时间晚 8 个小时(时区原因)。
- @DateTimeFormat 仅支持【表单键值对】这种提交方式,而且只能格式化前端到后端的数据,不能用于 JSON 格式的提交方式,也不能用于后端到前端的格式化。