解决SpringBoot中Jackson时间差8个小时的问题
概述
Jackson作为SpringBoot中默认的JSON mapping库,在java项目中应用十分广泛,你在项目实践中是不是遇到过这样的问题:
- 日期格式看上去没问题,但是序列化之后输出的字符串差了8小时
- 服务接口的日期格式不统一,你可能需要各个接口分别适配,不知道如何全局配置反序列化
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之间,夏天会有一小时时差。