解决Java MySQL驱动中MySQL时区与JVM时区的转换问题

在MySQL中,当使用timestamp作为储存时间的类型时,其读写都与sessiontime_zone有关。当没有显式指定时,当前session的time_zone会继承全局设置

  • 当写入时,会根据当前session的time_zone转换成UTC时间,将其时间戳进行储存
  • 当读取时,会将UTC时间戳转换为session所设置的time_zone所对应的时间

根据其他资料在连接字符串中添加参数serverTimezone

jdbc:mysql://localhost:3306/db?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

但发现此时程序依然使用UTC时间,其表现为在程序中保存当前时间到数据库,在数据库中显示的时间与本地一致,这显然与预期不符,对于东八区,数据库中的时间应该比本地晚8小时

查阅官方文档后,发现serverTimezone参数已被废弃,取而代之的是connectionTimeZoneserverTimezone只作为一个别名存在。同时需要将forceConnectionTimeZoneToSession设置为true,这样驱动才会将connectionTimeZone的值设置为session的time_zone,具体设置如下

jdbc:mysql://localhost:3306/db?characterEncoding=UTF-8&connectionTimeZone=Asia/Shanghai&forceConnectionTimeZoneToSession=true

这样MySQL将会自动进行时区转换

详细文档参考:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-connp-props-datetime-types-processing.html