###JAVA
JDBC驱动
com.mysql.cj.jdbc.Driver
JDBC连接字符串
jdbc:mysql://127.0.0.1:3006/db?useUnicode=true&characterEncoding=UTF8&useLegacyDatetimeCode=false&serverTimezone=UTC
MySQL
时区
show global variables like “%time_zone%”;
问题分析
驱动 com.mysql.cj.jdbc.Driver
Java通过MySQL的jdbc驱动连接MySQL服务端:
1.通过jdbc的serverTimezone参数设置数据库连接的时区。
2.当未设置serverTimezone时,数据库将连接使用MySQL服务端的time_zone。
补充
MySQL的 system_time_zone 变量显示的是MySQL服务器启动时从操作系统获取的时区。这是服务器操作系统的当前时区,不是MySQL的当前时区。
MySQL的 time_zone 变量则是MySQL服务器当前正在使用的时区。默认情况下,这个值是’SYSTEM’,意味着MySQL将使用操作系统的时区。
结论
在JDBC连接字符串中设置了serverTimezone=UTC+8,Java应用程序将使用UTC+8时区与MySQL数据库交互。也就是说当应用程序将日期和时间发送到数据库时,它们将被视为UTC+8时区的时间。同样,从数据库检索的日期和时间也将被转换为UTC+8时区。
因此,要确保Java应用程序(通过JDBC连接字符串设置的serverTimezone)和你的MySQL数据库(通过time_zone设置的)使用的是相同的时区,以避免日期和时间的混淆。
示例
应用程序在北京时间下午3点(UTC)向Mysql数据库插入一个Timestamp,那么这个Timestamp将被视为下午3点的UTC时间。
- 当MySQL数据库的time_zone设置为’SYSTEM’,并且系统时区为’CST’(系统时区:Asia/Shanghai,也是UTC+8),那么这个Timestamp将存储为上午8点。
- 当MySQL数据库的time_zone设置为’SYSTEM’,并且系统时区为’CST’(系统时区:UTC),那么这个Timestamp将被存储为下午3点。