springboot如何統(tǒng)一設(shè)置時(shí)區(qū)
springboot 統(tǒng)一設(shè)置時(shí)區(qū)
控制springboot服務(wù)的時(shí)區(qū)為東八區(qū)
@SpringBootApplication
public class Application {
? public static void main(String[] args) {
? ? // 設(shè)置時(shí)區(qū)為上海時(shí)區(qū),即東八區(qū)
? ? TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.SHORT_IDS.get("CTT")));
? ? SpringApplication.run(Application.class, args);
? }
}以下是測(cè)試?yán)?/p>
springboot 啟動(dòng)時(shí)候設(shè)置時(shí)區(qū),如下代碼所示
@SpringBootApplication
public class EwPbServerApplication {
? ? public static void main(String[] args) {
? ? ? ? TimeZone timeZone = TimeZone.getTimeZone("UTC");
? ? ? ? TimeZone.setDefault(timeZone);
? ? ? ? SpringApplication.run(EwPbServerApplication.class, args);
? ? }
}測(cè)試請(qǐng)求接口獲取時(shí)間
?? ?@GetMapping("test")
? ? @ApiOperation(value = "測(cè)試時(shí)間", httpMethod = "GET")
? ? public void test() {
? ? ? ? //當(dāng)前時(shí)間為 2022-09-06 17:46
? ? ? ? //啟動(dòng)類(lèi)設(shè)置時(shí)區(qū)后,獲取當(dāng)前時(shí)間
? ? ? ? Date date = new Date();
? ? ? ? DateTime date1 = DateUtil.date();
? ? ? ? LocalDateTime localDateTime = LocalDateTime.now();
? ? ? ? //設(shè)置時(shí)區(qū)為-東八區(qū)
? ? ? ? LocalDateTime.now(ZoneId.of("Asia/Shanghai"))
? ? ? ? log.info("date=={}", date);
? ? ? ? log.info("date1=={}", date1);
? ? ? ? log.info("localDateTime=={}", localDateTime);
? ? ? ? log.info("now=={}", now);
// ? ? ? ?2022-09-06 09:47:01.385 ?xxxx ?: date==Tue Sep 06 09:47:01 UTC 2022
// ? ? ? ?2022-09-06 09:47:01.385 ?xxxx ?: date1==2022-09-06 09:47:01
// ? ? ? ?2022-09-06 09:47:01.386 ?xxxx ?: localDateTime==2022-09-06T09:47:01.381
// ? ? ? ?2022-09-06 09:47:01.386 ?xxxx ?: now==2022-09-06T17:47:01.385
? ? }由測(cè)試結(jié)果得知,springboot 啟動(dòng)時(shí)設(shè)置時(shí)區(qū)之后全局生效,但是優(yōu)先級(jí)小于手動(dòng)設(shè)置
springboot mysql 時(shí)區(qū)問(wèn)題總結(jié)
尋找原因
后端開(kāi)發(fā)中常見(jiàn)的幾個(gè)時(shí)區(qū)設(shè)置
第一個(gè)設(shè)置點(diǎn)配置文件 spring.jackson.time-zone
第二個(gè)設(shè)置點(diǎn) 高版本SpringBoot版本 mysql-connector-java 用的是8.X,mysql8.X的jdbc升級(jí)了,增加了時(shí)區(qū)(serverTimezone)屬性,并且不允許為空。
第三個(gè)設(shè)置點(diǎn) mysql time_zone變量
詞義
serverTimezone臨時(shí)指定mysql服務(wù)器的時(shí)區(qū)
spring.jackson.time-zone 設(shè)置spring默認(rèn)時(shí)區(qū)
system_time_zone mysql服務(wù)器時(shí)區(qū) ,time_zone默認(rèn)System追隨system_time_zone
幾種情況
1、time_zone 為 System,serverTimezone為GMT+8,jackson.time-zone未定義

插入情況



再查詢(xún)此條記錄

個(gè)人覺(jué)得Spring默認(rèn)時(shí)區(qū)為格林尼治時(shí)區(qū),web服務(wù)器當(dāng)前時(shí)區(qū)為東八區(qū),進(jìn)行加8操作。
2、set GLOBAL time_zone = '+3:00',serverTimezone為GMT+8,jackson.time-zone為GMT+8
createTime 為 timestamp類(lèi)型

修改配置后,需要重啟SpringBoot
新增情況

數(shù)據(jù)庫(kù)中顯示

查詢(xún)記錄

個(gè)人理解,serverTimezone設(shè)置覆蓋掉了mysql的time_zone變量,跟SpringBoot會(huì)話時(shí)區(qū)還是東8
3、上述環(huán)境,不重啟SpringBoot,直接改變time_zone = '+5:00'
改變后,上條記錄往后調(diào)整2小時(shí)。

SpringBoot查詢(xún),一樣

說(shuō)明,timeStamp類(lèi)型存儲(chǔ)的是格林尼治時(shí)間,加上time_zone時(shí)區(qū)
當(dāng)time_zone變化時(shí),會(huì)話沒(méi)結(jié)束,serverTimeZone東8還是對(duì)應(yīng)time_zone的東3
SpringBoot插入


個(gè)人理解,serverTimeZone東8 還是和 time_zone 東3對(duì)應(yīng),但是插入發(fā)現(xiàn) 當(dāng)前time_zone已經(jīng)改成東5,就加2小時(shí)。
重啟SpringBoot,重新查詢(xún)


雖然,mysql變量time_zone為+5,但是重啟后,serverTimeZone直接覆蓋,設(shè)置時(shí)間區(qū)間為東8
重新把time_zone改回東3

改回重新打開(kāi)表,發(fā)現(xiàn)又回來(lái)了
不啟動(dòng)SpringBoot,查詢(xún)數(shù)據(jù),還是老樣子

此時(shí),添加一條數(shù)據(jù)。

往前推了2小時(shí)。
![]()
SpringBoot查詢(xún)

重啟SpringBoot,查出來(lái)就是庫(kù)中數(shù)據(jù)。

4、serverTimezone為GMT,jackson.time-zone為GMT+8,time_zone為東3



serverTimeZone為格林尼治時(shí)間,web服務(wù)器為東八,所以直接推遲8小時(shí)

取出來(lái)剛好反一下,顯示正常。
此時(shí),修改serverTimeZone為東八。

5、時(shí)間字段類(lèi)型為timestamp,使用默認(rèn)current_timestamp, serverTimezone為GMT,jackson.time-zone為GMT+8,time_zone為東3
因mysql時(shí)區(qū)東三時(shí)間為

插入后數(shù)據(jù)為

但是serverTimeZone為格林尼治時(shí)間,jackson.time-zone為東八,加8小時(shí)

6、時(shí)間字段類(lèi)型為datetime,serverTimezone為GMT+8,jackson.time-zone為GMT+8,time_zone為東3
插入

庫(kù)中

查詢(xún)

time_zone從東3修改為東5
重新打開(kāi)庫(kù)

不啟動(dòng)SpringBoot

重啟SpringBoot,還是一樣。
修改serverTimeZone為GMT,其他不改動(dòng)


查詢(xún)

總結(jié)
jackson.time-zone管前端到web服務(wù)器 轉(zhuǎn)換的時(shí)區(qū)。
如果是時(shí)間類(lèi)型為datetime,serverTimeZone說(shuō)了算。
如果時(shí)間類(lèi)型為timestamp
1、當(dāng)time_zone和serverTimeZone不統(tǒng)一情況,會(huì)話中,表中時(shí)間數(shù)據(jù),按照serverTimeZone設(shè)定
2、如果過(guò)程中,修改了time_zone變量,庫(kù)中數(shù)據(jù)直接變更。但是不影響當(dāng)前會(huì)話查詢(xún),新增數(shù)據(jù),就會(huì)根據(jù)time_zone調(diào)整量,調(diào)整實(shí)際入庫(kù)。
3、SpringBoot重啟,其實(shí)就是新會(huì)話。情況同上_1。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot時(shí)區(qū)問(wèn)題解決以及徹底解決時(shí)差問(wèn)題
- springboot項(xiàng)目如何設(shè)置時(shí)區(qū)
- 如何解決springboot數(shù)據(jù)庫(kù)查詢(xún)時(shí)出現(xiàn)的時(shí)區(qū)差異問(wèn)題
- SpringBoot如何根據(jù)用戶系統(tǒng)時(shí)區(qū)動(dòng)態(tài)展示時(shí)間
- SpringBoot中?Jackson?日期的時(shí)區(qū)和日期格式問(wèn)題解決
- Spring啟動(dòng)指定時(shí)區(qū)的兩種方法
相關(guān)文章
java Class文件內(nèi)部結(jié)構(gòu)解析過(guò)程詳解
java class的文件結(jié)構(gòu),java class文件結(jié)構(gòu)是基于字節(jié)流的,用unicode進(jìn)行編碼,下面說(shuō)說(shuō)java Class文件內(nèi)部結(jié)構(gòu)分析2013-11-11
java連接Oracle數(shù)據(jù)庫(kù)的方法解析
本文主要對(duì)java連接Oracle數(shù)據(jù)庫(kù)方法進(jìn)行步驟解析,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12
Springboot @Value獲取值為空問(wèn)題解決方案
這篇文章主要介紹了Springboot @Value獲取值為空問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析
這篇文章主要介紹了Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Spring Security OAuth2集成短信驗(yàn)證碼登錄以及第三方登錄
這篇文章主要介紹了Spring Security OAuth2集成短信驗(yàn)證碼登錄以及第三方登錄,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
idea指定maven的settings文件不生效的問(wèn)題解決
本文主要介紹了idea指定maven的settings文件不生效的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Java 8 動(dòng)態(tài)類(lèi)型語(yǔ)言Lambda表達(dá)式實(shí)現(xiàn)原理解析
Java 8支持動(dòng)態(tài)語(yǔ)言,看到了很酷的Lambda表達(dá)式,對(duì)一直以靜態(tài)類(lèi)型語(yǔ)言自居的Java,讓人看到了Java虛擬機(jī)可以支持動(dòng)態(tài)語(yǔ)言的目標(biāo)。接下來(lái)通過(guò)本文給大家介紹Java 8 動(dòng)態(tài)類(lèi)型語(yǔ)言Lambda表達(dá)式實(shí)現(xiàn)原理分析,需要的朋友可以參考下2017-02-02
mybatis-plus批處理IService的實(shí)現(xiàn)示例
這篇文章主要介紹了mybatis-plus批處理IService的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

