欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中?Jackson?日期的時區(qū)和日期格式問題解決

 更新時間:2022年12月10日 11:29:41   作者:蜀山雪松  
因為最近項目需要國際化,需要能夠支持多種國際化語言,目前需要支持三種(法語、英語、簡體中文),這篇文章主要介紹了SpringBoot中?Jackson?日期的時區(qū)和日期格式問題,需要的朋友可以參考下

1、使用場景

        因為最近項目需要國際化,需要能夠支持多種國際化語言,目前需要支持三種(法語、英語、簡體中文)。我們的項目部署環(huán)境為使用阿里云(德國)節(jié)點。以前我們項目主要用戶在中國國內(nèi)。一部署到德國服務(wù)器節(jié)點就出現(xiàn)一個問題了。數(shù)據(jù)返回的時間不對,存儲的時間也有時差了。此文章僅僅與UTC標(biāo)準(zhǔn)時間與北京時間(東八區(qū)時間)作為實際例子。最后跟蹤發(fā)現(xiàn),如下幾點原因:

1.1、數(shù)據(jù)庫MySQL也是有時區(qū)的概念的。

     通過如下命令可以查詢MySQL的時區(qū)

 show variables like "%time_zone%";

如果未做任何修改會顯示如下:

+------------------+--------+
| Variable_name  | Value |
+------------------+--------+
| system_time_zone | CST  |
| time_zone    | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
#time_zone說明mysql使用system的時區(qū),system_time_zone說明system使用CST時區(qū)

1.2、系統(tǒng)時區(qū)意味著與計算機的操作系統(tǒng)時區(qū)相同。

以下是我們北京時間使用MySQL時區(qū)

 set global time_zone = '+8:00'; ##修改mysql全局時區(qū)為北京時間,即我們所在的東8區(qū)
> set time_zone = '+8:00'; ##修改當(dāng)前會話時區(qū)
> flush privileges; #立即生效

或者通過修改MySQL的 my.cnf配置文件來修改時區(qū)
# vim /etc/my.cnf ##在[mysqld]區(qū)域中加上
default-time_zone = '+8:00'
# /etc/init.d/mysqld restart ##重啟mysql使新時區(qū)生效

1.2、SpringBoot默認(rèn)的Json視圖轉(zhuǎn)換框架Jackson也有時區(qū)概念

     Jackson日期反序列化時區(qū)問題,Jackson里 JsonFormat的源碼

/**
 * Value that indicates that default {@link java.util.TimeZone}
 * (from deserialization or serialization context) should be used:
 * annotation does not define value to use.
 *<p>
 * NOTE: default here does NOT mean JVM defaults but Jackson databindings
 * default, usually UTC, but may be changed on <code>ObjectMapper</code>.
 */
public final static String DEFAULT_TIMEZONE = "##default";
 
值,該值指示默認(rèn){@鏈接java.util.TimeZone}
 
(來自反序列化或序列化上下文)應(yīng)使用:
 
注釋未定義要使用的值。
 
注意:這里的默認(rèn)值并不意味著JVM默認(rèn)值,而是Jackson數(shù)據(jù)綁定。
 
默認(rèn)值,通常為UTC,但可以在<code>objectmapper<code>上更改。

那個注釋已經(jīng)說明默認(rèn)情況下會將 時區(qū)設(shè)置為UTC ,Jackson反序列化時間類型的底層實際上調(diào)用的是Java的 SimpleDateFormat#parse() 方法,而JVM中的時區(qū)則會根據(jù)你的操作系統(tǒng)來獲取,所以JVM認(rèn)為你的時區(qū)應(yīng)該是 GMT+8 時區(qū),
而要將 UTC 時區(qū)的時間轉(zhuǎn)成 GMT+8 時區(qū)的時間,就會將你傳進(jìn)來的時間+8個小時。

2、代碼實現(xiàn)

2.1、解決方案一下在每個帶有日期地方加上注解

日期類型的字段上的 @JsonFormat 加上屬性 timezone="GMT+8"

@NotNull
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@JsonProperty("start_time")
private Date startTime;

此類方法需要在包含日期地方都加上注解屬性,比較繁瑣。

2.2、只需要配置一個bean實現(xiàn)整體修改

@Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
        return jacksonObjectMapperBuilder ->
                jacksonObjectMapperBuilder.timeZone(TimeZone.getTimeZone("GMT+8"));
    }

參考文章:Jackson日期反序列化時區(qū)問題

2.3、使用SpringBoot的配置方式

spring.jackson.default-property-inclusion=NON_NULL
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

第一個設(shè)置就是使用24小時的時間格式;第二個設(shè)置就是設(shè)置時區(qū)為東八區(qū)。

但是配置時候需要注意

Finally, if you opt out of the Spring Boot default MVC configuration by providing your own @EnableWebMvc configuration, you can take control completely and do everything manually by using getMessageConverters from WebMvcConfigurationSupport.

《Spring Boot Reference Guide》 

需要去掉

@EnableWebMvc

參考文章:

SpringBoot升級指定jackson版本的問題

SpringBoot利用jackson格式化時間的三種方法

java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化

3、成果展現(xiàn)

        經(jīng)過轉(zhuǎn)換配置轉(zhuǎn)換之后;能夠正確的獲得和存取對應(yīng)的時間,建議使用

        2.2、只需要配置一個bean實現(xiàn)整體修改 或者使用 2.3、使用SpringBoot的配置方式 方式比較通用性。

其中如果使用FastJson轉(zhuǎn)換也可能遇見同樣的問題,可以參考文章

springmvc fastjson 反序列化時間格式化方法(推薦)

4、總結(jié)

       在SpringBoot開發(fā)應(yīng)用之中設(shè)計日期轉(zhuǎn)換需要特別注意,能夠主要目標(biāo)能夠是的存儲和返回的日期能夠?qū)?yīng)上自己的本地時區(qū)。同時能夠使用較為通用的轉(zhuǎn)換方式解決相關(guān)問題。

相關(guān)文章

  • 解決JDK8的ParallelStream遍歷無序的問題

    解決JDK8的ParallelStream遍歷無序的問題

    這篇文章主要介紹了解決JDK8的ParallelStream遍歷無序的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 普通對象使用spring容器中的對象的實現(xiàn)方法

    普通對象使用spring容器中的對象的實現(xiàn)方法

    這篇文章主要介紹了普通對象使用spring容器中的對象的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • RocketMQ設(shè)計之故障規(guī)避機制

    RocketMQ設(shè)計之故障規(guī)避機制

    這篇文章主要介紹了RocketMQ設(shè)計之故障規(guī)避機制,故障規(guī)避機制就是用來解決當(dāng)Broker出現(xiàn)故障,Producer不能及時感知而導(dǎo)致消息發(fā)送失敗的問題,下面詳細(xì)介紹需要的小伙伴可以參考一下
    2022-03-03
  • Java中的Unsafe在安全領(lǐng)域的使用總結(jié)和復(fù)現(xiàn)(實例詳解)

    Java中的Unsafe在安全領(lǐng)域的使用總結(jié)和復(fù)現(xiàn)(實例詳解)

    unsafe里面有很多好用的方法,比如allocateInstance可以直接創(chuàng)建實例對象,defineAnonymousClass可以創(chuàng)建一個VM匿名類(VM?Anonymous?Class),以及直接從內(nèi)存級別修改對象的值。這篇文章主要介紹了Java中的Unsafe在安全領(lǐng)域的一些應(yīng)用總結(jié)和復(fù)現(xiàn),需要的朋友可以參考下
    2022-03-03
  • 枚舉java語言中的修飾符組合的實例代碼

    枚舉java語言中的修飾符組合的實例代碼

    這篇文章主要介紹了枚舉java語言中的修飾符組合,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • mybatis查詢實現(xiàn)返回List<Map>類型數(shù)據(jù)操作

    mybatis查詢實現(xiàn)返回List<Map>類型數(shù)據(jù)操作

    這篇文章主要介紹了mybatis查詢實現(xiàn)返回List<Map>類型數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • java解析多層嵌套json字符串問題

    java解析多層嵌套json字符串問題

    這篇文章主要介紹了java解析多層嵌套json字符串問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Spring學(xué)習(xí)之動態(tài)代理(JDK動態(tài)代理和CGLIB動態(tài)代理)

    Spring學(xué)習(xí)之動態(tài)代理(JDK動態(tài)代理和CGLIB動態(tài)代理)

    本篇文章主要介紹了Spring學(xué)習(xí)之動態(tài)代理(JDK動態(tài)代理和CGLIB動態(tài)代理),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • java使用鏈表來模擬棧的入棧出棧操作實例代碼

    java使用鏈表來模擬棧的入棧出棧操作實例代碼

    這篇文章主要介紹了java 使用鏈表來模擬棧的入棧出棧操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 在SpringBoot當(dāng)中使用Thymeleaf視圖解析器的詳細(xì)教程

    在SpringBoot當(dāng)中使用Thymeleaf視圖解析器的詳細(xì)教程

    Thymeleaf是一款開源的模板引擎,它允許前端開發(fā)者使用HTML與XML編寫動態(tài)網(wǎng)頁,hymeleaf的主要特點是將表達(dá)式語言嵌入到HTML結(jié)構(gòu)中,它支持Spring框架,使得在Spring MVC應(yīng)用中集成非常方便,本文給大家介紹了在SpringBoot當(dāng)中使用Thymeleaf視圖解析器的詳細(xì)教程
    2024-09-09

最新評論