SpringBoot 保存 MySql 时间时差8小时

释放双眼,带上耳机,听听看~!

最近在搭建 SpringBoot 项目,在集成 MyBatis,在做数据保存或者更新,发现 Java 上的时间跟最终保存在 MySql 的时间不一致,少了 8 小时;

这种 +8 / -8 ,可以很容易的判断出来,时区有问题;

问题排查

Java 断点 new Date(); 时间是正常无误的;
MySql 查询 select now(); 时间是正常无误的;
我用的本地数据库,我时间没问题啊,所以时间无误;

查询 MySql 时区

SHOW VARIABLES LIKE '%time_zone%';
-- 显示的结果
system_time_zone:CST
time_zone:SYSTEM
CST 同时可以代表如下 4 个不同的时区:美国,澳大利亚,中国,古巴四个国家的标准时间
Central Standard Time (USA) UTC-6:00
Central Standard Time (Australia) UTC+9:30
China Standard Time UTC+8:00
Cuba Standard Time UTC-4:00
  • 它不是一个固定的时区,所以也排除掉;
  • 我们再看下 my.ini 的配置,我在里面加上,让它默认 +8
default-time-zone = '+8:00'

时区

但是问题依旧没解决;

  • 最容易遇到的几个地方的时区都没问题,到底坑在哪里呢?来了来了,坑在这里。查看下我们的 jdbc 连接的url
url: jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=UTC
  • 重点:serverTimezone
  • 这里默认了服务时区为 UTC
  • UTC 时区代表哪呢?

很可惜,它并不代表任何国家了,它代表了世界,又称世界统一时间,世界标准时间,国际协调时间,简称 UTC。

  • 既然 UTC 都没有一个标准,那我们就改成标准的;
serverTimezone=Asia/Shanghai
  • 这是亚洲上海,相信您很熟悉。
  • 还有 Asia/ChongqingAsia/Hong_Kong
  • 通过改成以上的,问题解决;妥了~

想查看详细的时区列表,里面非常详细

/usr/share/zoneinfo

人已赞赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧