0%

MySql时区与Java项目的时区问题

背景

一日部署完项目postman测试,发现json返回结果的时间字段与数据库的时间相差了13个小时。马上进行了排查问题工作。

排查问题

  1. 查看mysql时区
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)

发现数据库的是CST时区
2. 因为我的项目和mysql都是docker容器装的,所以查看这两个docker 容器的时间显示
docker exec -it mysql /bin/bash
docker exec -it project /bin/bash
进入容器后,date命令查看显示Mon Jun 15 11:19:13 CST 2020,都是CST,首先我们要明白CST时区的含义
CST时区4种含义:
. 美国中部时间 Central Standard Time (USA) UTC-06:00
. 澳大利亚中部时间 Central Standard Time (Australia)
. UTC+09:30 中国标准时 China Standard Time
. UTC+08:00 古巴标准时 Cuba Standard Time UTC-04:00
另外:美国从“3月11日”至“11月7日”实行夏令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 相差 13 小时。
这好像就查到原因了,接下来就是解决问题了。

解决问题

法1. 配置文件my.cnf修改时区

1
2
##在[mysqld]
default-time_zone = '+8:00'

重启mysql服务。检查,返回json结果时间与数据库一致。
法2. 直接在application.yml配置文件中datasource后添加
useTimezone=true&serverTimezone=GMT%2B8
重新deploy一下,正确
对比下来好像第二种方法较为简单,不用修改mysql配置文件。😄。

总结

正常情况下,数据库表时间不受服务器及其它影响,存进去是多少取出来时间也是多少。唯一改变的因素就是在返回json结果时一般返回的时间是json字符串,这就需要加上所在的时区显示json格式,如东八区如下图:
,在遇到时区问题时具体问题应具体分析,此篇可做参考😄。

欣赏此文?求鼓励,求支持!