linux下为java设置正确的时区

来源:互联网 发布:java 项目中使用log4j 编辑:程序博客网 时间:2024/05/22 03:40

       公司新装的测试环境,发现报表上显示的时间比正常时间差了8个小时,检查了一下系统时间,发现设置完全正确,这就很奇怪了;

       后来想到因为系统中使用的时间类型是timestamp类型,所以会有时区的问题,当时区设置有问题的时候就会发生查看当前时间设置正确,但是时间怎么也对不上的情况;

       于是到网上查询如何设置时区,走了一些弯路,在此总结一下:

  • 方法一
在 tomcat的jvm 运行参数加上 -Duser.timezone=GMT+8 ;
设置好后,就会忽略系统设置的时区,这种方法虽然简单直接,但是却不是一种好的方式,要从根源上解决问题!

  • 方法二
映射时区文件/etc/localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime

java获取时区读取的就是/etc/localtime这个文件(准确的说应该是hotspot jvm,openjdk不起作用,要用方法一);
删了/etc/localtime,java时区就变成了GMT,软链接到指定时区后,java时区就是localtime指定的时区;



以下方法个人亲测针对hotspot jvm不管用(也许针对openjdk 虚拟机起作用);有没有/etc/sysconfig/clock这个文件,不会对jvm有任何影响,但是应该会对计算机关闭启动的时间有影响;


在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

1 0