轉自:http://hi.baidu.com/iammonster/blog/item/d4b386de053c0f5ecdbf1a1b.html
今天遇到一個問題,就是本機資料傳到另外一台機器後時間加了8個小時,查資料瞭解了一下。
當使用JAVA網路編程的時候,需要注意:時區。user.timezone
可以使用下面的代碼遍曆當前的系統屬性。
Java代碼
- //------------------------------------------------------------------------------
- final Properties p = System.getProperties();
- final Enumeration e = p.keys();
- while (e.hasMoreElements())
- {
- final String prt = (String) e.nextElement();
- final String prtvalue = System.getProperty(prt);
- System.out.println(prt + ":" + prtvalue);
- }
- //--------------------------------------------------------------------------------
//------------------------------------------------------------------------------final Properties p = System.getProperties(); final Enumeration e = p.keys(); while (e.hasMoreElements()) { final String prt = (String) e.nextElement(); final String prtvalue = System.getProperty(prt); System.out.println(prt + ":" + prtvalue); }//--------------------------------------------------------------------------------
輸出中有一項:user.timezone,是JVM當前系統的時區。你要檢查運行機器上的時區是否一致,所以代碼最好是使用時間的時候統一設定。
Java代碼
- //--------------------------------------------------------------------------
- final TimeZone zone = TimeZone.getTimeZone("GMT+8");
- //-------------------------------------------------------------------------
//--------------------------------------------------------------------------final TimeZone zone = TimeZone.getTimeZone("GMT+8");//-------------------------------------------------------------------------
設定預設時區。當然你可以這樣檢查一下:
Java代碼
- //---
- System.out.println(TimeZone.getDefault()); //輸出當前預設時區
- final TimeZone zone = TimeZone.getTimeZone("GMT+8"); //擷取中國時區
- TimeZone.setDefault(zone); //設定時區
- System.out.println(TimeZone.getDefault()); //輸出驗證
- //---
//---System.out.println(TimeZone.getDefault()); //輸出當前預設時區final TimeZone zone = TimeZone.getTimeZone("GMT+8"); //擷取中國時區TimeZone.setDefault(zone); //設定時區System.out.println(TimeZone.getDefault()); //輸出驗證//---
除了上面的解決方案外,還可以:
在TOMCAT的JAVA運行參數添加
-Duser.timezone=Asia/Shanghai或者,如果有啟動的定時器或首次執行的代碼,可以使用語句
System.setProperty("user.timezone","Asia/Shanghai");來設定
但是為解決時區問題,這樣編碼實在太煩,所以你要知道如何從根本上解決問題:
LINUX下:jre是從/etc/sysconfig/clock這個檔案中擷取時區資訊的,修改次檔案即可,沒有的話添加一個。
附clock檔案內容:
ZONE="Asia/Shanghai"
UTC=false
ARC=false
ZONE -- 時區
UTC -- 表明時鐘設定為UTC。
ARC -- 僅用於alpha表明使用ARC。
但是windows下,據說是修改:Drive:\Program Files\Common Files\Microsoft
Shared\Web Server Extensions\60\Config
很遺憾我沒有搞定,參考:http://support.microsoft.com/kb/888253/zh-cn
補充:搞定windows下的方法:
檢查註冊表:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
是不是有問題,我的問題是很多缺失,JAVA底層讀取註冊表的時候,還沒有讀到中國標準時間,就終止了,取的是預設的GMT標準時間,和我機器上的時間差
8個小時。
你可以找一份完好的註冊表資訊導進去,也可以刪除損壞的在中國時區前面的那些不用的其他時區,保證中國時區正確就行了。
///2222
Java代碼
- 1.public class TimeTest {
- 2. public static void main(String[] args) {
- 3.
- 4. //java.util.Calendar.getInstance().setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
- 5.
- 6. //System.out.println(TimeZone.getDefault().getID());
- 7. System.out.println(java.util.Calendar.getInstance().getTime());
- 8. System.out.println(java.util.Calendar.getInstance().getTimeZone());
- 9. System.out.println(new Date().toLocaleString());
- 10.
- 11. }
- 12.}
1.public class TimeTest { 2. public static void main(String[] args) { 3. 4. //java.util.Calendar.getInstance().setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); 5. 6. //System.out.println(TimeZone.getDefault().getID()); 7. System.out.println(java.util.Calendar.getInstance().getTime()); 8. System.out.println(java.util.Calendar.getInstance().getTimeZone()); 9. System.out.println(new Date().toLocaleString()); 10. 11. } 12.}
13.
14.輸出結果如下:
15.Mon Mar 17 15:18:24 CST 2008
16.sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]
17.2008-3-17 15:18:24
但是我到了linux系統下,時區的ID就變成了“America/New_York”,輸出的是西方時間。
查了好多中文資料都沒徹底解決,這台伺服器曾經是“Mon Mar 17 15:18:24 EST 2008
”,西方時間,後來改為CST 上海時間,在程式中輸出的時間就和系統時間相差了13個小時,java虛擬機器讀取的時區不是系統設定的時區嗎?不太明白是怎麼回事。。。