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); ? } }
以下是測試?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); ? ? } }
測試請求接口獲取時(shí)間
?? ?@GetMapping("test") ? ? @ApiOperation(value = "測試時(shí)間", httpMethod = "GET") ? ? public void test() { ? ? ? ? //當(dāng)前時(shí)間為 2022-09-06 17:46 ? ? ? ? //啟動(dòng)類設(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 ? ? }
由測試結(jié)果得知,springboot 啟動(dòng)時(shí)設(shè)置時(shí)區(qū)之后全局生效,但是優(yōu)先級小于手動(dòng)設(shè)置
springboot mysql 時(shí)區(qū)問題總結(jié)
尋找原因
后端開發(fā)中常見的幾個(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升級了,增加了時(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未定義
插入情況
再查詢此條記錄
個(gè)人覺得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類型
修改配置后,需要重啟SpringBoot
新增情況
數(shù)據(jù)庫中顯示
查詢記錄
個(gè)人理解,serverTimezone設(shè)置覆蓋掉了mysql的time_zone變量,跟SpringBoot會(huì)話時(shí)區(qū)還是東8
3、上述環(huán)境,不重啟SpringBoot,直接改變time_zone = '+5:00'
改變后,上條記錄往后調(diào)整2小時(shí)。
SpringBoot查詢,一樣
說明,timeStamp類型存儲(chǔ)的是格林尼治時(shí)間,加上time_zone時(shí)區(qū)
當(dāng)time_zone變化時(shí),會(huì)話沒結(jié)束,serverTimeZone東8還是對應(yīng)time_zone的東3
SpringBoot插入
個(gè)人理解,serverTimeZone東8 還是和 time_zone 東3對應(yīng),但是插入發(fā)現(xiàn) 當(dāng)前time_zone已經(jīng)改成東5,就加2小時(shí)。
重啟SpringBoot,重新查詢
雖然,mysql變量time_zone為+5,但是重啟后,serverTimeZone直接覆蓋,設(shè)置時(shí)間區(qū)間為東8
重新把time_zone改回東3
改回重新打開表,發(fā)現(xiàn)又回來了
不啟動(dòng)SpringBoot,查詢數(shù)據(jù),還是老樣子
此時(shí),添加一條數(shù)據(jù)。
往前推了2小時(shí)。
SpringBoot查詢
重啟SpringBoot,查出來就是庫中數(shù)據(jù)。
4、serverTimezone為GMT,jackson.time-zone為GMT+8,time_zone為東3
serverTimeZone為格林尼治時(shí)間,web服務(wù)器為東八,所以直接推遲8小時(shí)
取出來剛好反一下,顯示正常。
此時(shí),修改serverTimeZone為東八。
5、時(shí)間字段類型為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í)間字段類型為datetime,serverTimezone為GMT+8,jackson.time-zone為GMT+8,time_zone為東3
插入
庫中
查詢
time_zone從東3修改為東5
重新打開庫
不啟動(dòng)SpringBoot
重啟SpringBoot,還是一樣。
修改serverTimeZone為GMT,其他不改動(dòng)
查詢
總結(jié)
jackson.time-zone管前端到web服務(wù)器 轉(zhuǎn)換的時(shí)區(qū)。
如果是時(shí)間類型為datetime,serverTimeZone說了算。
如果時(shí)間類型為timestamp
1、當(dāng)time_zone和serverTimeZone不統(tǒng)一情況,會(huì)話中,表中時(shí)間數(shù)據(jù),按照serverTimeZone設(shè)定
2、如果過程中,修改了time_zone變量,庫中數(shù)據(jù)直接變更。但是不影響當(dāng)前會(huì)話查詢,新增數(shù)據(jù),就會(huì)根據(jù)time_zone調(diào)整量,調(diào)整實(shí)際入庫。
3、SpringBoot重啟,其實(shí)就是新會(huì)話。情況同上_1。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)字符串的分割(基于String.split()方法)
Java中的我們可以利用split把字符串按照指定的分割符進(jìn)行分割,然后返回字符串?dāng)?shù)組,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)字符串的分割的相關(guān)資料,是基于jDK1.8版本中的String.split()方法,需要的朋友可以參考下2022-09-09(starters)springboot-starter整合阿里云datahub方式
這篇文章主要介紹了(starters)springboot-starter整合阿里云datahub方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11聊一聊SpringBoot服務(wù)監(jiān)控機(jī)制
這篇文章主要介紹了聊一聊SpringBoot服務(wù)監(jiān)控機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04java使用Jdom實(shí)現(xiàn)xml文件寫入操作實(shí)例
這篇文章主要介紹了java使用Jdom實(shí)現(xiàn)xml文件寫入操作的方法,以完整實(shí)例形式分析了Jdom針對XML文件寫入操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10SpringMVC REST風(fēng)格深入詳細(xì)講解
這篇文章主要介紹了SpringMVC REST風(fēng)格,Rest全稱為Representational State Transfer,翻譯為表現(xiàn)形式狀態(tài)轉(zhuǎn)換,它是一種軟件架構(gòu)2022-10-10解決java junit單元測試@Test報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決java junit單元測試@Test報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Java實(shí)現(xiàn)MD5加密的方式與實(shí)例代碼
MD5加密是一種常見的加密方式,我們經(jīng)常用在保存用戶密碼和關(guān)鍵信息上。那么它到底有什么,又什么好處呢,會(huì)被這么廣泛的運(yùn)用在應(yīng)用開發(fā)中2021-10-10mybatis Example的Criteria用法:or與isNull詳解
這篇文章主要介紹了mybatis Example的Criteria用法:or與isNull詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12