#情景描述
以Mysql做为数据库的JavaWeb项目,对于Mysql中的Time,Date,DateTime类型,Java的对应类型都是Date。Java程序在存储和读取相应字段的数据的时候,有时候会发现,存进去的不是预期的时间值,或者读取出来后发现和实际预期的会有误差。举个例子,想要操做存储的时间是2017-01-01 08:00:00,可是实际呈现出来的是2017-01-01 08:00:00,差了8小时有没有?这个会根据不一样状况有所相差,通常都差一些个小时数,对应的分和秒数据倒是一致的。mysql
#问题分析 mysql中发现存的确实是2017-01-01 08:00:00,可是Java中读取中到对应的Entity中时就自动变成2017-01-01 16:00:00,这个从数据库中读取出来就没有通过其余程序的任务处理直接就变更了。分析可能就是由于Web服务器上的时区/时间和Mysql服务器时区时间不一致。sql
1.可能JavaWeb项目中时区和Mysql时区不一致 在mysql中进入命令模式,敲入下面命令: show variables like '%time_zone%';经过该命令能够查看MySQL时区。数据库
Java程序中,使用TimeZone.getDefault()服务器
两者对比一下查看是否不一样时区,不一致的状况下对时区进行调整到一致.net
2.上述时区一致时,还出现该状况,查查是否Java Web项目链接串中加了?servertimezone=utc,尝试去掉,再试试结果看看,这里网上有人说去掉后会出现没法识别timezone的乱码问题,建议不要使用mysql connector 6.0.x以上版本,要使用5.1.x的版本,而且不加上servertimezone。多是个BUGserver
#问题解决 我遇到的状况是相差了八个小时,时区不一致,且改为一致了后还出现。其中解决方法是这样的:blog
show variables like '%time_zone%'; TimeZone.getDefault() 发现不一致,而后修改了Mysql的时区get
修改Mysql时区命令it
set time_zone='+8:00'; show variables like '%time_zone%';乱码
查看后改变了,再运行,仍是出现了问题
而后把mysql链接串servertimezone去掉也不行,换成GMT也不行
最后变成Asia/Shanghai或者PRC才能够,目前项目时间上正常了。