解决Java MySQL驱动中MySQL时区与JVM时区的转换问题
在MySQL中,当使用timestamp
作为储存时间的类型时,其读写都与session
的time_zone
有关。当没有显式指定时,当前session的time_zone
会继承全局设置
- 当写入时,会根据当前session的
time_zone
转换成UTC时间,将其时间戳进行储存 - 当读取时,会将UTC时间戳转换为session所设置的
time_zone
所对应的时间
根据其他资料在连接字符串中添加参数serverTimezone
1 | jdbc:mysql://localhost:3306/db?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai |
但发现此时程序依然使用UTC时间,其表现为在程序中保存当前时间到数据库,在数据库中显示的时间与本地一致,这显然与预期不符,对于东八区,数据库中的时间应该比本地晚8小时
查阅官方文档后,发现serverTimezone
参数已被废弃,取而代之的是connectionTimeZone
,serverTimezone
只作为一个别名存在。同时需要将forceConnectionTimeZoneToSession
设置为true
,这样驱动才会将connectionTimeZone
的值设置为session的time_zone
,具体设置如下
1 | 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
解决Java MySQL驱动中MySQL时区与JVM时区的转换问题