jpa mysql 日期_SpringBoot2 jpa mysql保存日期相差13或14小时

背景

项目中采用springboot+jpa+mysql来保存数据,在测试环境发现保存的数据时间都不准确,相差13个小时,故走上探坑之旅。

排查问题过程

日期不准确第一时间想到的肯定是时区问题,和相差8小时一个道理,不过13或者14个小时,一般小伙伴可能并不能第一时间想到这里,话不多说,直接查看Mysql时区:

show variables like "%time_zone%";

0a3e6c91b675?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

time_zone.png

如上图,可以看到数据库使用的系统的CST,那么这里的CST到底是哪里的时区呢,请看下面:

美国中部时间:Central Standard Time (USA) UT-6:00

澳大利亚中部时间:Central Standard Time (Australia) UT+9:30

中国标准时间:China Standard Time UT+8:00

古巴标准时间:Cuba Standard Time UT-4:00

上面这个4个地方的标准时间都可以是CST的简写,所以是容易引起混乱的,查看了其他环境的时区设置也是CST,但是日期并没有出现问题,说明这里应该是中国标准时间UT+8:00,那么排除数据库时区问题。

但是眼神好的小伙伴应该已经发现了,UT-6 UT+8 不正好14个小时么?那么13个小时怎么来的,原来美国从“3月11日”至“11月7日”实行夏令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 刚好相差 13 小时,那么问题明确了这里肯定还是时区问题。

既然数据库本身的时区问题排除了,那么自然就想到是不是java里日期问题,查看代码java里使用的new Date();取的是服务器的时间,核对了服务器时间是正确的,并且打印出的日期毫秒值转成日期后也是正确的,那么也排除了java里设置的时间问题。

那么最后只能猜想是不是在java 连接数据库的时候发生问题了,这里自然是考虑jdbc连接的问题,于是百度一下url参数,刚好发现一篇文章讲到了mysql-connector-java的8.0后的版本会影响读取到的时区值,果断查看jar包版本:

0a3e6c91b675?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

发现确实是引用的8以后的版本,到这里基本确定问题的根源了。

解决方案

在数据库连接url后添加参数 &serverTimezone=Asia/Shanghai 即可。

修改数据库时区

show variables like "%time_zone%";

set global time_zone = '+8:00';

flush privileges; #立即生效

永久修改数据库时区

# vim /etc/my.cnf ##在[mysqld]区域中加上

default-time_zone = '+8:00'

# /etc/init.d/mysqld restart ##重启mysql使新时区生效

验证

使用方案一重新插入一条数据记录,发现日期值已经正常。

方法2、3未做验证,但猜想应该可以解决。

参考文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值