@JsonFormat注解对日期类型进行序列化时造成的时区问题(@JsonFormat注解用法说明)

发布时间 2023-10-09 10:50:35作者: Marydon

1.情景展示

在前后端交互过程当中,往往需要后端返回前端日期类型数据。

在后台程序,我们往往是不需要对日期类型数据进行格式化的,而在将数据返回给前端的时候,可能会需要对日期类型进行格式化。

如何很好的解决这个矛盾呢?

2.具体分析

最好的解决办法就是:只在返回前端数据时,进行格式转换。(也就是:序列化)。

我们可以使用Jackson的@JsonFormat注解来实现。

3.解决方案

@JsonFormat注解,是在Jackson中定义的一个注解,是一个时间格式化注解。

此注解用在java类的日期属性上,作用:把DATE类型的数据转化成为我们想要的格式(在日期类型进行序列化时,格式化成指定格式的日期字符串)。

第一步:确定是否需要引入依赖

非SpringBoot项目

@JsonFormat注解不是SPRING自带的注解,而是Jackson的注解,所以使用该注解前需要添加jackson相关的依赖包。

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

SpringBoot项目

SpringBoot项目就不需要自己手动添加依赖了,因为在spring-boot-start-web下已经包含了jackson的相关依赖了。

第二步:在日期属性上使用@JsonFormat注解 

在这一步又要分两种情况。

情形1:使用的是LocalDateTime或LocalTime

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createtime;
@JsonFormat(pattern = "HH:mm:ss")
private LocalTime createtime;

这个时候,在@JsonFormat注解当中,直接定义好格式就可以了。 

情形2:使用的是java.util.Date

错误用法:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createtime;

 

时间相差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;

小结:

当使用Date日期类型时,进行序列化,需要指定时区。

而使用LocalDateTime时,进行序列化,无需指定时区(当然,如果指定时区也是可以的)。 

4.拓展

不同的JSON类对于日期类型进行序列化时,有自己的默认格式化风格。

如果使用的是java.util.Date类型

Jackson和FastJson都是默认将日期类型转成了时间戳。

 

而Net的Json,则是将日期转成了如下格式:

如果使用的是LocalDateTime类型 

Jackson将日期类型转成了数组。

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐: