@DateTimeFormat 和 @JsonFormat你真的了解吗

前言

博主在学习的过程中,发现网上对于 @DateTimeFormat@JsonFormat都是千篇一律且以偏概全的解释:

  • @DateTimeFormat用于前端传给后端的时间格式转换
  • @JsonFormat用于后端传给前端的时间格式转换

加上博主之前所使用的 Jeecg框架也是在时间属性上同时加了这两个注解。导致博主在一段时间内对这个解释深信不疑!知道前不久遇到了一个 Bug 后,我才发现网上千篇一律且以偏概全的荒谬理论真的是误人子弟!下面,博主将自己学习理解的见解分享给大家😀

@JsonFormat 注解

出处:com.fasterxml.jackson.annotation.JsonFormat

作用:将日期类型数据在 JSON 格式和 java.util.Date 对象之间转换。约束时间的接收格式和响应格式 (接收和响应的都是JSON字符串) 。与传输方向没有关系(前端到后端 OR 后端到前端都可以使用)

常用属性:

属性名

作用

pattern

设置时间格式。

eg:pattern="yyyy-MM-dd HH:mm:ss"

建议配合 Hutool 的 DatePattern常量类使用

pattern = DatePattern.NORM_DATETIME_PATTERN

timezone

指定具体时区。

eg:timezone="GMT+8"

注意:因为我们是东八区(北京时间),使用时需要加上时区属性( 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

类型为DateTimeFormat.ISO,常用值:

DateTimeFormat.ISO.DATE:格式为 yyyy-MM-dd

DateTimeFormat.ISO.DATE_TIME:格式为 yyyy-MM-dd hh:mm:ss.SSSZ

DateTimeFormat.ISO.TIME:格式为 hh:mm:ss.SSSZ

DateTimeFormat.ISO.NONE:表示不使用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的区别:

  1. @JsonFormat 既可以约束前端传入的时间类型参数格式,也可以约束后端响应给前端的时间类型格式;与请求的数据类型有关,必须为 JSON 类型!
  2. 目前大部分 Java 项目都是使用 JSON 的方式传输前后端数据(即前端使用 JSON 提交,后端使用 @RequestBody 注解接收参数的形式),使用 @JsonFormat 单一注解即可。
  3. @DateTimeFormat 只能约束前端传入的时间类型参数格式,且如果单独使用 @DateTimeFormat 时,响应给前端的时间会比实际时间晚 8 个小时(时区原因)。
  4. @DateTimeFormat 仅支持【表单键值对】这种提交方式,而且只能格式化前端到后端的数据,不能用于 JSON 格式的提交方式,也不能用于后端到前端的格式化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值