最近有遇到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]
下面我把更新前的注冊表文件放在這里,如果有碰到這個問題的朋友,可以先備注你自己的注冊表,然后再導入它,看看行不行,如果行的話就很好了,如果不行,再還原你的注冊表就可以了.