@JsonFormat注解对日期类型进行序列化时造成的时区问题(@JsonFormat注解用法说明)
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将日期类型转成了数组。
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/17750947.html