java获取数据库时间差8小时处理

文章描述了一位开发者遇到的时间差问题,问题源于数据库、系统时区以及JVM时区的不一致。在docker环境中,系统时区的调整并未解决时间问题,最终发现是JVM时区导致的时间差异。解决方案是通过代码设置JVM时区为上海时区。对于已运行的docker容器,文章提出了无需重启即可改变时区的方法。
摘要由CSDN通过智能技术生成

时间差异:

我数据库时间和当前时间是对应上的,在存入一条记录后,重新从数据库获取出来后,发现时间相差了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的时区?

后面有时间再来完善这些内容把。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值