时间差异:
我数据库时间和当前时间是对应上的,在存入一条记录后,重新从数据库获取出来后,发现时间相差了8个小时。
看到这里都认为是时区问题,8小时,肯定是时区没有设置为东8区导致的,也确实如此,但也不简单。
原因分析:
猜想1:数据库连接的时区不对导致获取到的时间差了8小时
我查看了我的数据库连接,一般来说数据库用serverTimezone=GTM或UTC都会存在差8小时的情况,然而我的并没有这种情况
jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
猜想2:系统时区不对,导致时间差
系统采用dockre部署,我首先查看了宿主机的时间,结果是对的。然后进入docker查看,发现docker容器内时间不对,刚好差了8小时。
然后我进入到dokcer容器中,将容器时区更改过来
cd etc
mv localtime localtime_bak //备份当前时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime //将时区更改为上海
经过如上操作后,docker时间终于能对上了,然后我从数据库获取到的记录时间还是不对,看来并不是这个问题。
但这里有个疑问,在系统时间不对时,java向数据库执行插入操作时,插入到数据库的时间居然是对的,这里并没有采用数据库默认时间,而是采用new Date()给字段赋值的,这里是什么原因还犹未可知???
猜想2:jvm时区不对导致
走到这一步我已经快放弃了,我将sql日志打印出来,然后再日志中输出了sql和时间,然后发现sql查询出来的时间是对的。java输出的时间就不对了,差了正好8小时。走到这一步忽然想起,这会不会跟jvm的时区有关系尼,忽然想到,这是docker容器部署,我再部署时并没有设置时区,所以导致docker容器系统时区本来就是错的,这也导致jvm沿用了系统的时区。
嗯,好像就是这个问题了,但怎么改尼,有人说在运行参数上增加参数,也有重新指定docker容器的时区就好了。
好吧,解决这个问题确实应该从根本上解决,上面这两种也都是很好的解决办法,但我已经运行了容器,并且设置了很多的运行参数和挂载,实在不想重新运行容器了。找一个解决办法,强制将jar的运行时区更改过来不就好了。
解决方案:
// 设置时区为上海时区,即东八区
TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.SHORT_IDS.get(“CTT”)));
疑问:
1.系统时间不对时,new Date()得到的时间应该也不对,为何数据库会是正确的时间?
2.docker容器运行后,有什么办法更改时区?
3.怎么动态指定并修改jvm的时区?
后面有时间再来完善这些内容把。