溫馨提示×

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

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

JDK時(shí)區(qū)TimeZone與操作系統(tǒng)不一致怎么辦

發(fā)布時(shí)間:2021-12-17 14:07:43 來源:億速云 閱讀:369 作者:小新 欄目:編程語言

這篇文章主要介紹JDK時(shí)區(qū)TimeZone與操作系統(tǒng)不一致怎么辦,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

【背景】一臺(tái)Windows服務(wù)器的遷移工作,涉及操作系統(tǒng)、應(yīng)用以及數(shù)據(jù)庫,其中:
  1.操作系統(tǒng)由Windows Server 2003--->Windows Server 2008
  2.數(shù)據(jù)庫:Oracle 10.2.0.4--->Oracle 11.2.0.3
  3.應(yīng)用遷移本在本篇博文的討論范圍
 之前方案經(jīng)過幾輪評(píng)審,該改進(jìn)地方修改了多次。測(cè)試環(huán)境也進(jìn)行了多次測(cè)試。自認(rèn)為在生產(chǎn)環(huán)境變更會(huì)一切順利,萬無一失,自信滿滿,但很快被現(xiàn)實(shí)狠狠的抽了一巴掌。經(jīng)梳理,碰到的問題主要有兩個(gè),以下計(jì)劃分兩篇進(jìn)行總結(jié)歸納,若有錯(cuò)誤,歡迎各位大神指正。
  服務(wù)器遷移完成后,啟動(dòng)定時(shí)作業(yè)出現(xiàn)了一個(gè)異?,F(xiàn)象,該作業(yè)理應(yīng)生成T-1日文件不知為何文件變成了T-2日。出現(xiàn)問題的時(shí)候,開發(fā)人員并不在現(xiàn)場(chǎng),本著先不麻煩別人的原則。第一反應(yīng)就是有可能是數(shù)據(jù)庫遷移造成的。
 為排除數(shù)據(jù)庫方面的問題,我們查詢了常用時(shí)間變量sysdate,systimestamp,localtimestamp以及current_timestamp,發(fā)現(xiàn)輸出都和自然時(shí)間相同。

  1. SELECT sysdate FROM dual;

  2. SYSDATE

  3. -----------------

  4. 20170409 07:56:19


  5. SELECT systimestamp FROM dual;

  6. SYSTIMESTAMP

  7. ---------------------------------------------------------------------------

  8. 09-APR-17 07.56.52.311941 AM +08:00


  9. SELECT localtimestamp FROM dual;

  10. LOCALTIMESTAMP

  11. ---------------------------------------------------------------------------

  12. 09-APR-17 07.59.04.507493 AM


  13. SELECT current_timestamp FROM dual;

  14. CURRENT_TIMESTAMP

  15. ---------------------------------------------------------------------------

  16. 09-APR-17 07.59.17.414758 AM +08:00

  那看來和數(shù)據(jù)庫無關(guān)?正在猶豫的時(shí)候,再次啟動(dòng)定時(shí)作業(yè)的時(shí)候發(fā)現(xiàn)執(zhí)行結(jié)果正確了,生成了T-1日的文件,且文件內(nèi)容也無異常。奇怪,不過定時(shí)作業(yè)總算執(zhí)行正常了,由于有其他事情要忙,這個(gè)事情就沒有再深入分析。
  悲催的是,第二天問題又重現(xiàn)了,且情況和前一天幾乎一樣:剛開始作業(yè)異常,分析了一段時(shí)間,再次重啟作業(yè)又正常了。什么情況?看來這個(gè)不是偶發(fā)現(xiàn)象,要仔細(xì)深入的研究個(gè)明白了。在分析過程我們發(fā)現(xiàn)了一個(gè)非常有趣的現(xiàn)象:作業(yè)若在8點(diǎn)之前執(zhí)行就會(huì)異常,一過8點(diǎn)作業(yè)執(zhí)行正常。難道是時(shí)區(qū)造成的?不對(duì)啊,前面已經(jīng)查詢已經(jīng)確認(rèn)了,數(shù)據(jù)庫時(shí)區(qū)和時(shí)間都沒問題。為了進(jìn)一步確認(rèn)數(shù)據(jù)庫時(shí)區(qū)正常,還是查看一下dbtimezone變量吧。

點(diǎn)擊(此處)折疊或打開

  1. SELECT dbtimezone FROM dual;

  2. DBTIME

  3. ------

  4. +08:00

   基本排查了數(shù)據(jù)庫的原因造成的,作為DBA的我不禁松了一口氣。下面的分析可以放松些了,不用提心吊膽啦,哈哈。既然懷疑時(shí)區(qū)造成的,那看看是不是操作系統(tǒng)的時(shí)區(qū)問題。但非常遺憾經(jīng)確認(rèn)操作系統(tǒng)時(shí)區(qū)設(shè)置也是正確的 :東8區(qū)。經(jīng)過一番確認(rèn)和排查,始終未發(fā)現(xiàn)服務(wù)器、數(shù)據(jù)庫參數(shù)設(shè)置的問題,找開發(fā)要代碼吧。代碼非常簡(jiǎn)單,截取部分有用內(nèi)容如下:

點(diǎn)擊(此處)折疊或打開

  1. String strCreDate = new java.sql.Date(new java.util.Date().getTime()-86400000).toString();

   具體生成T-1日還是T-2日的文件,由strCreDate變量決定的。那看來變量strCreDate的值有問題。我們分別做了一組實(shí)驗(yàn):8點(diǎn)前strCreDate的值為T-2,但8點(diǎn)后該值就變成了T-1.為清楚的看到JDK時(shí)區(qū)情況,寫了一個(gè)非常簡(jiǎn)單HelloWorld代碼,如下: 

點(diǎn)擊(此處)折疊或打開

  1. import java.util.TimeZone;

  2. import java.sql.Date;

  3. public class HelloWorld {

  4.     public static void main(String[] args) {

  5.     System.out.print("當(dāng)前的默認(rèn)時(shí)區(qū)為");

  6.     System.out.println(TimeZone.getDefault());                            //輸出當(dāng)前默認(rèn)時(shí)區(qū) 

  7.     final TimeZone zone = TimeZone.getTimeZone("GMT+8");                  //獲取中國時(shí)區(qū)

  8.     TimeZone.setDefault(zone);                                            //設(shè)置時(shí)區(qū)

  9.     System.out.println(TimeZone.getDefault());                            //輸出驗(yàn)證 

  10.     }

  11. }

   第一個(gè)輸出結(jié)果為:
JDK時(shí)區(qū)TimeZone與操作系統(tǒng)不一致怎么辦
 第二個(gè)輸出結(jié)果為:
JDK時(shí)區(qū)TimeZone與操作系統(tǒng)不一致怎么辦
    發(fā)現(xiàn)了什么了嗎?雖然操作系統(tǒng)的時(shí)區(qū)為東8區(qū),但是jdk獲取的時(shí)區(qū)不是東8區(qū),缺是UTC,因此造成了差8個(gè)小時(shí)的現(xiàn)象,即8點(diǎn)前作業(yè)異常,8點(diǎn)后作業(yè)又正常了。問題已經(jīng)找出來了,就是jdk的問題,解決方案就迎刃而解了。具體辦法如下:
 在下面四個(gè)目錄(Java\jre6\lib\zi\Etc、Java\jre6\lib\zi、Java\jdk1.6.0_18\jre\lib\zi\Etc、Java\jdk1.6.0_18\jre\lib\zi)下找到GMT文件備份一下,然后復(fù)制一份GMT-8并重命名為GMT,復(fù)制完畢,重新運(yùn)行一下java程序問題即可解決!
    按照上述方法處理后,再次運(yùn)行HelloWorld命令,輸出正常了。次日觀察作業(yè)也正常了。至此問題處理完畢。

以上是“JDK時(shí)區(qū)TimeZone與操作系統(tǒng)不一致怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(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)容。

jdk
AI