linux java时区设置_Linux下jvm时区设置-JAVA时区问题

本文讨论了在Linux环境下遇到的Java时区问题,解释了JVM如何从系统获取时区信息,并提供了设置和修复时区不一致的方法,包括修改`/etc/sysconfig/clock`文件和调整JVM启动参数。还提到了Windows系统下时区问题的解决方案,涉及注册表的检查和修复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//------------------------------------------------------------------------------

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虚拟机读取的时区不是系统设置的时区吗?不太明白是怎么回事。。。

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-12-04 11:58

浏览 10340

评论

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方式修改时区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值