溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么解決java獲取時(shí)間相差8小時(shí)的問題

發(fā)布時(shí)間:2021-09-13 15:13:30 來源:億速云 閱讀:747 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下怎么解決java獲取時(shí)間相差8小時(shí)的問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

三種時(shí)間差錯(cuò)問題:

  • java下使用new date()獲取的時(shí)間會(huì)和真實(shí)的本地時(shí)間相差8小時(shí)。

  • 本地獲取的時(shí)間沒有錯(cuò),存入數(shù)據(jù)庫(kù)的時(shí)候時(shí)間相差8小時(shí)。

  • 數(shù)據(jù)庫(kù)時(shí)間沒有錯(cuò),獲取到了后端,之后返回給前端相差8小時(shí)。

原因:

  • new date()調(diào)用的是jvm時(shí)間,而jvm使用的時(shí)間默認(rèn)是0時(shí)區(qū)的時(shí)間,即:和北京時(shí)間將會(huì)相差8小時(shí)。

  • mybatis將本地的數(shù)據(jù)傳入到mysql數(shù)據(jù)庫(kù)服務(wù)器的時(shí)候,服務(wù)器會(huì)對(duì)數(shù)據(jù)進(jìn)行檢測(cè),會(huì)把date類型的數(shù)據(jù)自動(dòng)轉(zhuǎn)換為mysql服務(wù)器所對(duì)應(yīng)的時(shí)區(qū),即0時(shí)區(qū),所以會(huì)相差8小時(shí)。

  • springboot中對(duì)加了@RestController或者@Controller+@ResponseBody注解的方法的返回值默認(rèn)是Json格式,

  • 所以,對(duì)date類型的數(shù)據(jù),在返回瀏覽器端時(shí),會(huì)被springboot默認(rèn)的Jackson框架轉(zhuǎn)換,而Jackson框架默認(rèn)的時(shí)區(qū)GMT(相對(duì)于中國(guó)是少了8小時(shí))。所以最終返回到前端結(jié)果是相差8小時(shí)

解決方案:

手動(dòng)設(shè)置jvm時(shí)間:將時(shí)間改為第8時(shí)區(qū)的時(shí)間:

TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

溫馨提示:如果是springboot項(xiàng)目,可以面向切面加上這個(gè),或者啟動(dòng)main類上加上如下代碼:

@PostConstruct
    void started() {
        TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
    }

注意:不要用下面方式,這個(gè)方式是錯(cuò)的,GMT-8最后獲取的時(shí)區(qū)還是0時(shí)區(qū)的。網(wǎng)上很多的教程說的是下面的方式,親測(cè)不行。

TimeZone tz = TimeZone.getTimeZone("ETC/GMT-8");
TimeZone.setDefault(tz);

在apprication.yml文件中配置一下數(shù)據(jù)庫(kù)連接信息,url加上這么一句:
&serverTimezone=GMT%2b8

怎么解決java獲取時(shí)間相差8小時(shí)的問題

可以解決存入數(shù)據(jù)庫(kù)的時(shí)間肯定是對(duì)的,本地獲取的時(shí)間則未必是北京時(shí)間。將spring的json構(gòu)造器的時(shí)區(qū)改正即可,在application.yml文件中添加:

怎么解決java獲取時(shí)間相差8小時(shí)的問題

或者可以使用注解,在entity實(shí)體類的date數(shù)據(jù)上添加注解,那么數(shù)據(jù)庫(kù)傳回的data數(shù)據(jù)要轉(zhuǎn)換為json格式的時(shí)候就是北京時(shí)間了,再次傳回到前端的時(shí)候,也不會(huì)出現(xiàn)時(shí)區(qū)問題。

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

不過,指的注意的是:這樣做,如果你的jvm時(shí)間依然是后臺(tái)0時(shí)區(qū)的,那么后臺(tái)要用時(shí)間執(zhí)行邏輯的時(shí)候,就要注意了,時(shí)間依然相差8小時(shí),還是建議用第一方法,直接整個(gè)jvm改為北京的8時(shí)區(qū)。

以上是“怎么解決java獲取時(shí)間相差8小時(shí)的問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI