轉:jvm設定時區問題

來源:互聯網
上載者:User
轉自:http://hi.baidu.com/iammonster/blog/item/d4b386de053c0f5ecdbf1a1b.html

今天遇到一個問題,就是本機資料傳到另外一台機器後時間加了8個小時,查資料瞭解了一下。

當使用JAVA網路編程的時候,需要注意:時區。user.timezone

可以使用下面的代碼遍曆當前的系統屬性。
Java代碼  

  1. //------------------------------------------------------------------------------  
  2. final Properties p = System.getProperties();  
  3.         final Enumeration e = p.keys();  
  4.         while (e.hasMoreElements())  
  5.         {  
  6.             final String prt = (String) e.nextElement();  
  7.             final String prtvalue = System.getProperty(prt);  
  8.             System.out.println(prt + ":" + prtvalue);  
  9.         }  
  10. //--------------------------------------------------------------------------------  
//------------------------------------------------------------------------------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代碼  
  1. //--------------------------------------------------------------------------  
  2. final TimeZone zone = TimeZone.getTimeZone("GMT+8");  
  3. //-------------------------------------------------------------------------  
//--------------------------------------------------------------------------final TimeZone zone = TimeZone.getTimeZone("GMT+8");//-------------------------------------------------------------------------

設定預設時區。當然你可以這樣檢查一下:
Java代碼  

  1. //---  
  2. System.out.println(TimeZone.getDefault()); //輸出當前預設時區  
  3. final TimeZone zone = TimeZone.getTimeZone("GMT+8"); //擷取中國時區  
  4. TimeZone.setDefault(zone); //設定時區  
  5. System.out.println(TimeZone.getDefault()); //輸出驗證  
  6. //---  
//---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. 1.public class TimeTest {     
  2. 2.    public static void main(String[] args) {     
  3. 3.             
  4. 4.        //java.util.Calendar.getInstance().setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));     
  5. 5.             
  6. 6.        //System.out.println(TimeZone.getDefault().getID());     
  7. 7.        System.out.println(java.util.Calendar.getInstance().getTime());     
  8. 8.        System.out.println(java.util.Calendar.getInstance().getTimeZone());     
  9. 9.        System.out.println(new Date().toLocaleString());     
  10. 10.             
  11. 11.    }     
  12. 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虛擬機器讀取的時區不是系統設定的時區嗎?不太明白是怎麼回事。。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.