`
wuzijingaip
  • 浏览: 329665 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Linux下jvm时区设置-JAVA时区问题

阅读更多
转自:http://hi.baidu.com/iammonster/blog/item/d4b386de053c0f5ecdbf1a1b.html

今天遇到一个问题,就是本机数据传到另外一台机器后时间加了8个小时,查资料了解了一下。

当使用JAVA网络编程的时候,需要注意:时区。user.timezone

可以使用下面的代码遍历当前的系统属性。
//------------------------------------------------------------------------------
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当前系统的时区。你要检查运行机器上的时区是否一致,所以代码最好是使用时间的时候统一设置。

//--------------------------------------------------------------------------
final TimeZone zone = TimeZone.getTimeZone("GMT+8");
//-------------------------------------------------------------------------


设置默认时区。当然你可以这样检查一下:
//---
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
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虚拟机读取的时区不是系统设置的时区吗?不太明白是怎么回事。。。
分享到:
评论
1 楼 yanji94521 2011-05-31  
现在回答这个问题,可能你早已解决。
再应用服务器启动时候,JVM会读取操作系统默认参数,其中包含时区。
获得操作系统时区后从支持列表中比对,JVM本身支持将近600种时区,如果找到,那么JVM实际时区和操作系统一直,如果在JVM没有找到支持的,那么JVM会根据当前操作系统时区,给出一个适当的时区。

例如:window环境 默认为GMT+8北京…… 实质JVM获取操作系统不是GMT+8,至于这个名称未具体跟踪,不过能确定的是,这个时区未在JVM支持中,所有,JVM给出一个shanghai的默认时区,shanghai这个默认时区是中国标准时区,其中包含了很重要的1986-1991年的夏时制处理机制,但现在操作时间并不希望出现夏时制的处理(如:1986-04-05 读取后变成 1986-04-04  实质为1986-04-04 23:00:00)此种情况实质为JVM计算夏时制的问题,至于谁导致的真的分不清了。针对这种情况可使用GMT+8作为JMV的启动参数(GMT+8国际时区,符合中国时间,且不存在夏时制的处理),或者全局setDefault方式修改时区。

相关推荐

    jdk-8u201-linux-arm64-vfp-hflt.tar.gz

    要安装这个JDK包,首先需要解压`jdk-8u201-linux-arm64-vfp-hflt.tar.gz`,然后将解压后的目录移动到系统指定的Java安装路径,如 `/usr/lib/jvm`。接着配置环境变量`JAVA_HOME`、`PATH`和`CLASSPATH`,确保系统能够...

    java-jdk1.8-jdk-8u152-linux-x64.zip

    JDK(Java Development Kit)包含了开发和运行Java应用程序所需的所有工具和库,包括Java虚拟机(JVM)、编译器、调试器以及其他实用工具。在本案例中,我们讨论的是JDK 8u152,这是一个更新版本,提供了许多性能...

    最新Java JDK 8u371免安装版(linux-64位)

    Java JDK 8u371是Java开发工具集的一个重要版本,特别针对Linux 64位操作系统设计。这个免安装版使得用户无需进行繁琐的安装步骤,只需解压即可使用,方便了开发者在Linux环境中的Java开发工作。下面将详细阐述Java ...

    最新Java JDK 8安装版(Linux 64位)

    Java 8对日期和时间处理进行了全面重构,引入了`java.time`包,提供了更易于使用的类,如`LocalDate`、`LocalTime`和`LocalDateTime`,以及处理时区和日期时间计算的`ZonedDateTime`等,解决了旧版API的许多问题。...

    java-jdk1.8-jdk-8u171-linux-x64.zip

    Java JDK 1.8是Java开发工具包的一个重要版本,主要针对Linux x64...在Linux x64环境下,正确安装和配置JDK是使用Java进行开发的前提。通过理解这些知识点,开发者能更好地利用Java 8的优势来编写高效、可靠的代码。

    jdk-8u60-linux-x64.tar.gz

    在Linux环境下,你可以使用`tar -zxvf jdk-8u60-linux-x64.tar.gz`命令来解压文件,然后设置环境变量`JAVA_HOME`、`PATH`和`CLASSPATH`,以便系统能够找到并正确运行JDK。安装完成后,你便可以开始使用JDK 8进行Java...

    jdk-1.8.0-391 linux

    4. **日期和时间API**:Java 8引入了新的java.time包,替换原有的日期和时间API,提供了更好的处理日期、时间和时区的能力。 5. ** Nashorn JavaScript引擎**:允许在Java应用中直接执行JavaScript代码,提高了跨...

    jdk8-linux.7z

    在Linux环境下,JDK通常以tar.gz压缩包的形式提供,如"jdk-8u211-linux-x64.tar.gz",这表明它是针对64位Linux系统的。 JDK 8引入了许多重要的新特性,包括: 1. Lambda表达式:Lambda表达式简化了函数式编程,使得...

    jdk-8u281-linux-aarch64.tar.gz

    2. **新日期/时间API**:JDK 8引入了新的`java.time`包,提供了更加强大和易用的日期、时间和时区处理功能,取代了原有的`java.util.Date`和`java.util.Calendar`。 3. **Stream API**:Stream API提供了一种新的...

    jdk8,jdk-8u201-linux-x64.tar.gz

    这个文件可能是关于在Linux系统上使用JDK8的指南,可能包含如何设置环境变量、编译Java源代码、运行Java程序等步骤。具体的指南内容需查看该文件才能得知。 总的来说,JDK8是Java编程的重要版本,它的特性极大地...

    jdk-8u231-linux-x64.tar.7z

    总之,"jdk-8u231-linux-x64.tar.gz"是Java开发者在Linux环境下开发、测试和部署Java应用的基础。通过了解和掌握JDK 8的新特性及使用方法,开发者可以更好地利用Java平台的强大功能,提高代码质量和开发效率。

    jdk-8u181-linux-x64.zip

    JDK 8u181包含了几个关键组件,如Java虚拟机(JVM)、Java编译器(javac)、Java运行时环境(JRE)以及各种开发工具,如Javadoc(用于生成API文档)和JAR(用于打包和运行Java应用程序)。此外,JDK还提供了诸如...

    JAVA8_官方版Win_Linux.zip

    Linux用户通常使用`tar`命令来提取文件,然后将解压后的目录移动到适当的位置,例如 `/usr/lib/jvm`,并手动设置环境变量。这包括在`~/.bashrc`或`/etc/profile`文件中添加`JAVA_HOME`和路径更新,以确保系统能够...

    Tomcat-启动参数设置

    - `-Duser.timezone=Asia/Shanghai`:设置JVM的时区为中国上海时区。 **注意事项:** - Windows环境中的参数前需要加上`set`命令。 - Linux环境中的参数需要被双引号包围。 #### 三、线程池配置 线程池是一种用于...

    windows下安装Linux虚拟机过程及Linux下搭建GIS开发环境过程

    编辑`~/.bashrc`或`~/.bash_profile`文件,添加`export PATH=$PATH:/usr/lib/jvm/java-8-openjdk-amd64/bin`(路径可能因系统而异),然后执行`source ~/.bashrc`使更改生效。 6. **安装Tomcat**:Tomcat是一个常用...

    jdk-8u11-linux-x64.tar.gz

    JDK(Java Development Kit)是Oracle公司发布的用于开发和运行Java应用程序的重要工具集,它包含了Java编译器、Java虚拟机(JVM)、Java类库以及各种开发和调试工具。JDK 8u11是Java 8的一个更新版本,它在Java 8的...

    jdk-8u191-linux-x64.tar

    Java 8引入了java.time包,包含了新的日期、时间、时区类,如LocalDate、LocalTime、LocalDateTime、ZonedDateTime等,提供了更加直观和强大的日期时间处理能力。 6. **Optional类** Optional类是一个容器对象,...

    jdk-8u171-linux-x64 RPM包格式

    4. **Date和Time API**:Java 8彻底重构了日期和时间处理,引入了java.time包,提供了更好的API来处理日期、时间、时区等。 5. **默认方法**:接口可以拥有默认实现,这使得向旧的API添加新方法成为可能,而不会...

    jdk1.8免费下载使用

    4. Date和Time API改进:Java 8提供了全新的日期和时间API(java.time包),解决了旧版API的许多问题,如线程安全、不可变性和时区处理等。 5. Nashorn JavaScript引擎:这个内置的JavaScript引擎允许Java代码与...

    bellsoft-jdk8u322+6-windows-amd64

    JDK是Java程序员的基础工具包,它提供了必要的API文档、编译器(javac)、Java虚拟机(JVM)以及其他的开发工具。 描述中提到的"openjdk8,64位"表明这是OpenJDK的一个实现,OpenJDK是一个开源的Java平台标准版...

Global site tag (gtag.js) - Google Analytics