> Linux教程 > Linux学习 >

Java获取时间与Linux不一致

问题描述
遇到一个问题,web显示的时间比服务器时间快12小时。Tomcat和MySQL安装在同一台服务器,系统是centos7,且服务器时间和MySQL时间一致,均是当前北京时间。
 
解决思路
1、首先查看后端传给前端的时间戳;
 
发现后端传过去的时间已经快了12小时,说明web显示异常是后端问题;
 
2、打印业务的日志,发现date显示的时间正常,但是date.getTime()对应的时间戳不正常:
 
 logger.info("date = {}.",date);
 logger.info("date = {}.",date.getTime());
 

 
date.getTime()对应的时间比date快12小时,应该是Java的Date.getTime()获取的时间有问题;
 
3、打印jvm的时区
 
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); 
 }
 

 
查看打印出的控制台的内容:
 
......
catalina.useNaming:true
user.timezone:America/New_York  ----》说明时区有问题 
java.awt.printerjob:sun.print.PSPrinterJob 
......
 

 
4、网上查资料,Linux jvm 是读取 /etc/sysconfig/clock 文件来确定时区, 如果没有可以添加一个。 打开后发现没有clock文件,手动创建一个,内容如下:
 
ZONE="Asia/Shanghai"
UTC=false
ARC=false
1
2
3
ZONE – 时区
 
UTC – 表明时钟设置为UTC
 
ARC – 仅用于alpha表明使用ARC
 
重启Tomcat,发现没生效。
5、继续排查,发现系统date命令和hwclock --show命令时间不一致,需要时钟与网络时间一致。
(date是系统时钟,hwclock是硬件时钟,系统时钟和硬件时钟可以查看这篇文章:linux hwclock命令参数及用法详解–linux显示/设置硬件时钟命令)
 
5.1、安装ntpdate工具
 
sudo yum -y install ntp ntpdate1
 
5.2、设置系统时间与网络时间同步
 
sudo ntpdate cn.pool.ntp.org1
 
5.3、将系统时间写入硬件时间
 
sudo hwclock --systohc1
 
5.4、查看系统时间
 
timedatectl
 
得到
 
[root@localhost fw-basic-service]# timedatectl status
Local time: Thu 2019-04-04 10:19:20 CST
Universal time: Thu 2019-04-04 02:19:20 UTC
RTC time: Thu 2019-04-04 02:19:44
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a NTP synchronized: no RTC in local TZ: no
DST active: n/a
 
此时重启Tomcat,时间变正常了。
 
 
 

 

(责任编辑:IT)