如何解決java獲取時間相差8小時的問題
三種時間差錯問題:
- java下使用new date()獲取的時間會和真實的本地時間相差8小時。
- 本地獲取的時間沒有錯,存入數(shù)據(jù)庫的時候時間相差8小時。
- 數(shù)據(jù)庫時間沒有錯,獲取到了后端,之后返回給前端相差8小時。
原因:
- new date()調(diào)用的是jvm時間,而jvm使用的時間默認是0時區(qū)的時間,即:和北京時間將會相差8小時。
- mybatis將本地的數(shù)據(jù)傳入到mysql數(shù)據(jù)庫服務(wù)器的時候,服務(wù)器會對數(shù)據(jù)進行檢測,會把date類型的數(shù)據(jù)自動轉(zhuǎn)換為mysql服務(wù)器所對應(yīng)的時區(qū),即0時區(qū),所以會相差8小時。
- springboot中對加了@RestController或者@Controller+@ResponseBody注解的方法的返回值默認是Json格式,
- 所以,對date類型的數(shù)據(jù),在返回瀏覽器端時,會被springboot默認的Jackson框架轉(zhuǎn)換,而Jackson框架默認的時區(qū)GMT(相對于中國是少了8小時)。所以最終返回到前端結(jié)果是相差8小時
解決方案:
手動設(shè)置jvm時間:將時間改為第8時區(qū)的時間:
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
溫馨提示:如果是springboot項目,可以面向切面加上這個,或者啟動main類上加上如下代碼:
@PostConstruct void started() { TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); }
注意:不要用下面方式,這個方式是錯的,GMT-8最后獲取的時區(qū)還是0時區(qū)的。網(wǎng)上很多的教程說的是下面的方式,親測不行。
TimeZone tz = TimeZone.getTimeZone("ETC/GMT-8"); TimeZone.setDefault(tz);
在apprication.yml文件中配置一下數(shù)據(jù)庫連接信息,url加上這么一句:
&serverTimezone=GMT%2b8
可以解決存入數(shù)據(jù)庫的時間肯定是對的,本地獲取的時間則未必是北京時間。將spring的json構(gòu)造器的時區(qū)改正即可,在application.yml文件中添加:
或者可以使用注解,在entity實體類的date數(shù)據(jù)上添加注解,那么數(shù)據(jù)庫傳回的data數(shù)據(jù)要轉(zhuǎn)換為json格式的時候就是北京時間了,再次傳回到前端的時候,也不會出現(xiàn)時區(qū)問題。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private Date lastTime;
不過,指的注意的是:這樣做,如果你的jvm時間依然是后臺0時區(qū)的,那么后臺要用時間執(zhí)行邏輯的時候,就要注意了,時間依然相差8小時,還是建議用第一方法,直接整個jvm改為北京的8時區(qū)。
總結(jié):都是時區(qū)問題
三個問題對應(yīng)三種場景:
- 后臺要存時間到數(shù)據(jù)庫的時候:用方法2解決本地時間和數(shù)據(jù)庫時間的問題;本質(zhì)是sql的服務(wù)器時區(qū)是0時區(qū)導(dǎo)致。
- 后臺要使用本地時間的時候,改變jvm的時區(qū);本質(zhì)是jvm的時區(qū)是0時區(qū)導(dǎo)致。
- 后臺返回數(shù)據(jù)到前端的時候出現(xiàn)時區(qū)問題,用注解或者yml中配置json生成器解決轉(zhuǎn)換格式的問題。本質(zhì)是json的構(gòu)造器用的時區(qū)是0時區(qū)導(dǎo)致。
到此這篇關(guān)于如何解決java獲取時間相差8小時的問題的文章就介紹到這了,更多相關(guān)java獲取時間相差8小時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea打開項目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題
這篇文章主要介紹了idea打開項目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08swagger添加權(quán)限驗證保證API(接口)安全性(兩種方法)
這篇文章主要介紹了swagger添加權(quán)限驗證保證API(接口)安全性(兩種方法),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01關(guān)于SSM框架下各層的解釋說明(Controller等)
這篇文章主要介紹了關(guān)于SSM框架下各層的解釋說明(Controller等),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Java應(yīng)用層協(xié)議WebSocket實現(xiàn)消息推送
后端向前端推送消息就需要長連接,首先想到的就是websocket,下面這篇文章主要給大家介紹了關(guān)于java后端+前端使用WebSocket實現(xiàn)消息推送的詳細流程,需要的朋友可以參考下2023-02-02Spring Boot Dubbo 構(gòu)建分布式服務(wù)的方法
這篇文章主要介紹了Spring Boot Dubbo 構(gòu)建分布式服務(wù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05詳解springboot整合ehcache實現(xiàn)緩存機制
這篇文章主要介紹了詳解springboot整合ehcache實現(xiàn)緩存機制,ehcache提供了多種緩存策略,主要分為內(nèi)存和磁盤兩級,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01