1. 程式人生 > >java new date 結果與作業系統時間相差8小時處理解決方法

java new date 結果與作業系統時間相差8小時處理解決方法

最近有遇到java的時間不對的事件,現象:

通過java語句獲得系統時間,用

Date d = new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
System.out.println(sdf.format(d));

或者:

    Calendar now = Calendar.getInstance();
    System.out.println(now.get(Calendar.HOUR_OF_DAY));
    System.out.println(now.get(Calendar.MINUTE));
    System.out.println(now.get(Calendar.SECOND));

取得的時間總是比系統時間少8個小時,獲得的總是格林尼治時間(0時區的時間),檢查系統時間確實是正確的,時區為GMT+8:00北京……等;但是此前並沒有發生這類問題,以前時間是正確的,但是重灌系統後出現了java的時間問題,可能是系統時間登錄檔出現問題,這裡就不修改登錄檔了。這時MyEclipse或Java預設的時間時區是0時區,所以:

考慮到程式碼的可移植性,在用到時間的地方都初始化當前的時區;加上程式碼:

setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

修改如下:

Date d = new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println(sdf.format(d));

或者:

    Calendar now = Calendar.getInstance();
    now.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));//important
    System.out.println(now.get(Calendar.HOUR_OF_DAY));
    System.out.println(now.get(Calendar.MINUTE));
    System.out.println(now.get(Calendar.SECOND));

這樣就可以了。

===========================================================================================

針對這一問題之前說過在系統程式碼用到時間時可以在時間初始化前加上以下一句話,但是這樣比較麻煩,因此,在安裝Java的JDK之後,可以替換幾個原始檔以達到相同的目的。

setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

另一種方法:

找到Java目錄下的

依次: jdk1.60/jre/lib/zi/Etc

      jdk1.60/jre/lib/zi

      java/jre1.6.0_14/jre/lib/zi/Etc

      java/jre1.6.0_14/jre/lib/zi

下找到GMT檔案,刪除之(可以備份一下,以防萬一),然後複製一份GMT-8並重命名為GMT替換原來的GMT。這樣,就達到了掩人耳目的目的。試一下,可以解決!

另登錄檔修改法

檢視 [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Time Zones]

下面我把更新前的登錄檔檔案放在這裡,如果有碰到這個問題的朋友,可以先備註你自己的登錄檔,然後再匯入它,看看行不行,如果行的話就很好了,如果不行,再還原你的登錄檔就可以了.