Java程序,插入new Date()时间,入mysql库后,时间比当前系统时间少了14个小时

废话不多说,直接上图,第一个,是程序日志打印时间,第二个是插入到数据库中的时间,数据库为mysql,时区设置为北京


问题背景:直接在数据库中写sql插入,没有出现时间不同的问题,但是程序一运行就出问题。日志打印时间都是正常的,但是入库出问题。所以问题锁定在数据库上。
技术指导:解决方案出处

总结:执行指令:show variables like '%time_zone%';得到结果:

 

 CST时区是一个非常混乱的时区,出现原因是美国曾多次修改时区。
直接导致的就是,Java默认会使用CST -0600作为默认设置,而北京作为标准的东八区时区,就会与CST的产生14个小时的时差

在服务器上执行“date”,看到时间,看到有CST字样
[root@dabiaoge ~]# date
Wed Jan 9 21:54:23 CST 2019
继续知识点扫盲:
CST时区
名为CST的时区是一个很混乱的时区,有四种含义:

美国中部时区Central Standard Time(USA)UTC-06:00
澳大利亚中部时区中央标准时间(澳大利亚)UTC + 09:30
中国标准时中国标准时区UTC + 08:00
古巴标准时古巴标准时区UTC-04:00

原因:CST的时区是一个很混乱的时区,在与MySQL协商会话时区时,Java会误以为是CST -0500或者CST -0600,而非CST +0800

解释原因是什么意思:
先来了解下美国的时区变化历史,美国规定每年从“3月11日”至“11月7日”实行夏令时,美国中部时区改为UTC-05:00;而“11月7日”至“3月11日”实行冬令时,美国中部时区改为UTC-06:00,博主的线上问题发现的时间是2019年1月9日,而此时美国中部的时区是UTC0600,而我们的时区是UTC0800,所以6+8=14个小时,因此线上的错误时间相隔14个小时。

 

解决方案:
1:数据库修改:

set global time_zone = '+08:00'
set time_zone = '+08:00'

2:程序修改
数据库链接后加入指定的时区:?serverTimezone=Asia/Shanghai