现象 : 获取数据时,接口返回的时间与实际的时间相差13个小时左右. 使用IDE查看数据库中的数据是正确的, 但是通过java程序获取出来之后, 时间异常.

经过一些资料查找, 发现 一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历 这篇文章所描述的现象和遇到的相同.

主要是CST时区的问题.

1
2
3
4
5
6
7
8
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

GMT(Greenwich Mean Time)代表格林尼治标准时间

CST却同时可以代表如下 4 个不同的时区:

1
2
3
4
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00

可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。

解决方案: 1.明确指定 MySQL 数据库的时区,不使用引发误解的 CST

1
2
3
4
5
mysql> set global time_zone = '+08:00';
Query OK, 0 rows affected (0.00 sec)

mysql> set time_zone = '+08:00';
Query OK, 0 rows affected (0.00 sec)

或者修改 my.cnf 文件,在 [mysqld] 节下增加 default-time-zone = '+08:00'

2.在JDBC连接中, 指定时区: serverTimezone=Asia/Shanghai 例如: datasource.jdbcUrl=jdbc:mysql://xxx.xx.xx.xx:3306/test?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai

参考文章 一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历