现象 : 获取数据时,接口返回的时间与实际的时间相差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 小时的排错经历