解決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之間,夏天會有一小時時差。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM