解决SpringBoot中Jackson时间差8个小时的问题

概述

Jackson作为SpringBoot中默认的JSON mapping库,在java项目中应用十分广泛,你在项目实践中是不是遇到过这样的问题:

  1. 日期格式看上去没问题,但是序列化之后输出的字符串差了8小时
  2. 服务接口的日期格式不统一,你可能需要各个接口分别适配,不知道如何全局配置反序列化

Jackson简介

Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。

ObjectMapper类

ObjectMapper是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。

 

数据绑定

简单的数据绑定是指JSON映射到Java核心数据类型。下表列出了JSON类型和Java类型之间的关系。

序号JSON 类型Java 类型
1 object LinkedHashMap<String,Object>
2 array ArrayList<Object>
3 string String
4 complete number Integer, Long or BigInteger
5 fractional number Double / BigDecimal
6 true | false Boolean
7 null null


Spring应用中如何使用Jackson

Spring Boot支持与三种JSON mapping库集成:Gson、Jackson和JSON-B。Jackson是首选和默认的。

Jackson是spring-boot-starter-json依赖中的一部分,spring-boot-starter-web中包含spring-boot-starter-json。也就是说,当项目中引入spring-boot-starter-web后会自动引入spring-boot-starter-json。

 

解决方案一,在Model的时间字段上加上注解

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date regisDate; //注册时间

 

解决方案二,application.properties配置文件增加以下配置

spring.jackson.time-zone=Asia/Shanghai

这里说明一下为什么用Asia/Shanghai 而不使用GMT+8;
GMT-8是东八区,北京时间和东八区一致。
Asia/Shanghai是已地区命名的地区标准时,在中国叫CST。这个地区标准时会兼容历史各个时间节点。中国1986-1991年实行夏令时,夏天和冬天差1个小时,Asia/Shanghai会兼容这个时间段。
结论:1992年以后,在中国,GMT-8和Asia/Shanghai是一样的时间,1986-1991之间,夏天会有一小时时差。

 

 

posted @ 2021-06-07 16:08  姜饼攻城狮  阅读(4123)  评论(0编辑  收藏  举报