Java获取时间与Linux不一致
时间:2019-05-24 17:40 来源:linux.it.net.cn 作者:IT
问题描述
遇到一个问题,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)
问题描述
遇到一个问题,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) |