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

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,时间变正常了。

参考

centos7 设置系统时间与网络同步
Java时间和本地Linux 时间不一致的原因
CentOS7修改时区的正确姿势

你可能感兴趣的:(编程工具,Java,Linux,hwclock,date,系统时间)