• 转:jvm设置时区问题


    转自: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虚拟机读取的时区不是系统设置的时区吗?不太明白是怎么回事。。。
  • 相关阅读:
    LeetCode第三题:Longest Substring Without Repeating Characters
    LeetCode第二题:Add Two Numbers
    LeetCode第一题:Two Sum
    第五章 单体内置对象
    第五章 引用类型 基本包装类型
    第五章 引用类型 Function 类型
    第五章 引用类型 RegExp 类型
    第五章 引用类型 Date类型
    第五章 引用类型 Array类型
    第五章 引用类型 Object类型
  • 原文地址:https://www.cnblogs.com/phoebus0501/p/1994350.html
Copyright © 2020-2023  润新知