SpringBoot - @JsonFormat注解详解

写在前面

@JsonFormat注解,是在Jackson中定义的一个注解,是一个时间格式化注解。此注解用于属性上,作用是把DATE类型的数据转化成为我们想要的格式。
比如:存储在MYSQL中的数据是dateTime类型,将数据获取以后封装到实体类中的时候,就会变成英文的时间格式(Wed Jul 27 02:26:43 CST 2022),而不是yyyy-MM-dd HH:mm:ss格式的时间(2022-07-27 02:26:43),@JsonFormat注解就可以解决这个问题。

一句话说明

该注解可用于返回日期数据时的时间格式化。
如果前端传来的为字符串格式的日期:“2022年07月29日 09时41分22秒”,则需要如下配置:
@JsonFormat(pattern = “yyyy年MM月dd日 HH时mm分ss秒”)
private Date createTime;
解析后存入DB中的则为:2022-07-29 09:41:22,而在查询时返回的数据则为:“2022年07月29日 09时41分22秒”

如何使用?

① 引入依赖

@JsonFormat注解不是SPRING自带的注解,而是Jackson的注解,所以使用该注解前需要添加jackson相关的依赖包。当然如果是 SpringBoot项目就不需要自己手动添加依赖了,因为在spring-boot-start-web下已经包含了jackson的相关依赖了。

<!-- JSON工具类 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.6</version>
</dependency>
② 添加注解

在实体类属性上面使用@JsonFormat注解。

/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;

/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
③ 注意事项

只是在将实体返回JSON格式数据时才有效的转换为(yyyy-MM-dd HH:mm:ss)格式的时间,其他时候日期格式不会被转换。

相差8小时

JASKSON在序列化时间时是按照国际标准时间GMT进行格式化的,而在国内默认时区使用的是CST时区,两者相差8小时,因为我们是东八区(北京时间),所以我们在格式化的时候要指定时区(timezone)。

中国时间(Asia/Shanghai) = 格林尼治时间(GMT)+ 8
格林尼治时间(GMT) = 世界协调时间(UTC) + 0

/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date createTime;

/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date updateTime;

时区概念

GMT(格林尼治时间),Greenwich Mean Time ,这是以英国格林尼治天文台观测结果得出的时间,这是英国格林尼治这个地方的时间,是过去使用的世界标准的时间;

UT(世界时),Universal Time ,这是根据原子钟计算出来的时间。

UTC(世界协调时间),Coordinated Universal Time,因为地球自转越来越慢,每年都会比前一年多出零点几秒,每隔几年,协调世界时组织委员会都会给世界时+1秒,让基于原子钟的世界时和基于天文学的格林尼治标准时间相差不至于太大,是现在使用的世界标准时间。

协调世界时不与任何地区位置相关,也不代表此刻某个地区的时间,所以在说明某地时间时要加上时区。
也就是说:GMT并不等于UTC,而是等于UTC+0,只是格林尼治刚好在0时区上。

A. 中国时间(Asia/Shanghai) = 格林尼治时间(GMT)+ 8
B. 格林尼治时间(GMT) = 世界协调时间(UTC) + 0

数据库的时区设置

url: jdbc:mysql://localhost:3306/servicex-single?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8

源码说明

@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonFormat {
    String DEFAULT_LOCALE = "##default";
    String DEFAULT_TIMEZONE = "##default";

	// 表示序列化后日期的格式,比如:yyyy-MM-dd HH:mm:ss 或者 yyyy年MM月dd日 HH时mm分ss秒
    String pattern() default "";
	// 表示序列化后的一种类型,默认为JsonFormat.Shape.ANY
    JsonFormat.Shape shape() default JsonFormat.Shape.ANY; 
	// 根据位置序列化的一种格式,默认为本地的语言简称,中国的语言简称为zh_CN
    String locale() default "##default";
	// 指定时区,默认是GMT,北京时间为:GMT+8
    String timezone() default "##default";

    OptBoolean lenient() default OptBoolean.DEFAULT;

    JsonFormat.Feature[] with() default {};

    JsonFormat.Feature[] without() default {};
   ...
}
  • 84
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值