Mysql保存时间datetime时,相差13小时的问题

起因

近期一个项目报告,线上服务器时间不对,比正常时间相差了13个小时,同一个数据库不同的应用端写入时间不对。

一般程序相差N个小时的问题,应该说99.99%是时区问题引起的,紧接着我们需要检查各环境的时区配置,当前数据库是使用的阿里云RDS 5.7。

排查

  1. 校验服务器时间,结果无误,正常的东八区时间。
  2. 校验docker容器内部时间,结果无误,正常的东八区时间。
  3. 校验jvm虚拟机时间配置,结果无误,正常的东八区时间。
  4. 校验mysql服务器的时间配置,结果无误,是正确的,不过时区项显示的是:CST时区,突然明悟。

CST 时区

名为 CST 的时区是一个很混乱的时区,有四种含义:

美国中部时间 Central Standard Time (USA) UTC-06:00
澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
中国标准时 China Standard Time UTC+08:00
古巴标准时 Cuba Standard Time UTC-04:00

美国从“3月11日”至“11月7日”实行夏令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 相差 13 小时。

为什么老的应用程序写入数据是没有问题的,而新应用有问题呢?差别就在于老系统中mysql驱动为老版本,而新系统采用了最新的mysq8.x驱动,新驱动与老驱动的处理方式的差异导致。

解决方法(其中一种即可)

  1. 直接将 mysql配置参数中的 system_time_zone修改为 +8:00,default-time-zone = '+08:00' 重启mysql生效。
  2. 在java程序mysql连接地址上添加参数 serverTimezone=Asia/Shanghai,重新发布程序即可,由于线上数据库不能轻易重启,我们采用滚动升级方式,无缝升级应用程序解决该问题。

Leave a Reply


正在读取数据……