问题说明
JAVA进程在运行过程中发现和当前时间相差8小时,检查服务器时间和互联网的北京时间一致,由此推测操作系统时区不对,经过查看操作系统时区,发现时区正确,通过jinfo命令查看Java进程发现时区不是东八区,由此找到原因,在此把排查过程做简要记录,便于后续遇到问题快速解决。
中国跨越了东五区、东六区、东七区、东八区、东九区五个时区,一般都统一采用东八区计时时间。
查看操作系统当前时间
[root@swk-204 ~]# date
Fri Jan 25 19:28:28 CST 2019
[root@swk-204 ~]# date "+%Y-%m-%d %H:%M:%S"
2019-01-25 19:28:36
[root@swk-204 ~]#
查看操作系统当前时区
方式一
[root@swk-204 ~]# date -R
Fri, 25 Jan 2019 19:04:13 +0800
-0800表示西八区,是美国旧金山所在的时区,+0800表示东八区,是中国上海所在的时区
方式二
[root@swk-204 ~]# date "+%Z"
CST
方式三
[root@swk-204 ~]# date
Fri Jan 25 19:05:43 CST 2019
方式四
[root@engine ~]# cat /etc/localtime
CST-8
时区为CST-8
通过grep关键字进行过滤
[root@engine bin]# jinfo 1728 |grep user.timezone
user.timezone = GMT
时区为GMT
JAVA进程调整时区
修改Java虚拟机时间
JAVA启动参数
-Duser.timezone=GMT+8
每个java程序启动的时候加参数
1.启动文件中的TimeZone设置:
public static void main(String[] args) {
TimeZone timeZone = TimeZone.getTimeZone("UTC");
TimeZone.setDefault(timeZone);
SpringApplication.run(MatrixApplication.class, args);
}
只对运行的console日志的时间影响。
2.数据连接字符串
jdbc:mysql://localhost:3306/gmall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
对与读取到的时间会自动减去+8小时插入到数据库(如果数据库设置的utc+8的北京时间的),查询的时候
3.springboot 接口时间字段返回配置
spring.jackson.date-format: yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone: GMT+8
对springboot rest接口时间字段生效。
时间格式化时区设置
如果没有设置会使用程序运行系统的默认的时区。
SimpleDateFormat dd=new SimpleDateFormat("yyyy/MM/dd");
log.info(TimeZone.getDefault().toString()); // 系统默认时区
log.info(dd.getTimeZone().toString());//SimpleDateFormat 使用的时区
log.info(dd.parse(dstr1).toString());
//dd.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
dd.setTimeZone((TimeZone.getTimeZone("Australia/Sydney")));//设置指定时区解析
log.info(dd.parse(dstr1).toString());
5.数据库时区设置:
show variables like '%time_zone%';
mysql> set time_zone='+8:00';
修改后 select 结果(timestamp)转换成相应timezone时间展示,DateTime字段不变化
插入的时间时转换相应的timezone时间插入