为解决MySQL时区不一致导致的时间字段读写异常,JDBC URL需显式配置serverTimezone=Asia/Shanghai等IANA时区ID,并推荐搭配useTimezone=true等参数确保正确转换。

在 Java 的 JDBC 连接 URL 中配置 MySQL 的 serverTimezone,主要是为了解决时区不一致导致的时间字段(如 DATETIME、TIMESTAMP)读写异常或自动转换错误的问题。MySQL 8.0+ 驱动(mysql-connector-java 8.0+)默认要求显式指定服务端时区,否则会报类似 The server time zone value 'XXX' is unrecognized 的错误。
正确配置 serverTimezone 参数的格式
在 JDBC URL 的查询参数部分(即 ? 后)添加 serverTimezone=xxx,值需使用 IANA 时区 ID(推荐),例如 Asia/Shanghai,而非简写如 CST 或 GMT+8(后者可能被忽略或解析失败)。
示例完整 URL:
jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true常用合法时区值参考
-
中国标准时间:
Asia/Shanghai(推荐,对应 UTC+8) -
东八区通用写法:
GMT%2B8(注意 + 需 URL 编码为%2B) -
UTC 时间:
UTC或GMT -
系统默认时区:
System(驱动会尝试读取 JVM 时区,但不推荐依赖)
⚠️ 注意:CST 是模糊缩写(可能指 China Standard Time、Central Standard Time 等),MySQL 驱动无法准确识别,应避免使用。
立即学习“Java免费学习笔记(深入)”;
配合其他时区相关参数更稳妥
仅设 serverTimezone 有时还不够,建议一并配置以下参数以统一行为:
-
useTimezone=true:启用客户端与服务端时区转换(对TIMESTAMP类型生效) -
timezone=Asia/Shanghai(旧版驱动用,新版已由serverTimezone替代) -
connectionTimeZone=Asia/Shanghai(可选,指定连接级时区,覆盖全局)
实际推荐组合:
?useSSL=false&serverTimezone=Asia/Shanghai&useTimezone=true&allowPublicKeyRetrieval=true验证是否生效的小技巧
连接成功后,可通过 SQL 查询确认服务端时区是否被正确识别:
SELECT @@global.time_zone, @@session.time_zone;同时检查 Java 端读取 TIMESTAMP 字段是否不再出现 14 小时偏差(常见于服务端 UTC、客户端东八区未对齐的情况)。


















