首先看一下mysql的配置default-time-zone 字段:

mysqld 配置:default-time-zone = ‘system’ 【这是mysql8的默认设置】
mysqld 配置:default-time-zone = ‘+8:00’ 【国内时间】
mysqld 配置:default-time-zone = ‘+0:00’ 【格林威治时间、格林威治平时】

改完配置要重启,通常用+8时间

这个配置作用在mysql内部的时间处理上,比如now()函数的使用
在使用sql语句时,比如lnsert插入新数据
我们自己的电脑在国内是+8时区,如果mysqld配置system或者+8,那么新插入数据是now()函数的时间和自己电脑相同
如果mysqld配置的是+0:00使用格林威治时间,那么如果电脑显示是19:00 晚上7点,那么insert到数据库时,数据库中显示11:00,上午11点。

我们在mysql中使用datetime存储时间
mysql存这个时间时不包含时区,存的是几点,取出来就是几点。

在mysql中存储:

id username password datetime
1  xixi     pw       2020-04-25 16:29:38
2  q        qq       2020-04-25 17:33:55
3  w        ww       2020-04-25 11:50:13

下面以id为3的数据为例

现在数据库配置改为+0:00
数据库所有时间查询时,显示不变。
现在有一条数据时间是:2020-04-25 11:50:13 【这个是数据库显示时间】
时间戳是:1587815413

select create_time,unix_timestamp(create_time) from user where id =3;
+---------------------+-----------------------------+
| create_time         | unix_timestamp(create_time) |
+---------------------+-----------------------------+
| 2020-04-25 11:50:13 | 1587815413 |
+---------------------+-----------------------------+

因为数据库设置为GMT+0,所以这个时间对应北京的时间就是:2020-04-25 19:50:13

这就是default-time-zone参数的作用

下面的例子中mysqld时区设置为+8,创建一个springboot+mybatis 的demo

=======================================================================================
jdbc连接中参数:serverTimezone=GMT%2B8 【+8】
运行程序在console中打印从mysql中取出来的数据:
Sat Apr 25 17:50:13 CST 2020
{“create_time”:1587808213000,”id”:3,”password”:”ww”,”username”:”w”}

我们从MySQL中取出来2020-04-25 11:50:13,并且认为这个时间就是GMT+8的,而我们自己的电脑也是GMT+8时区的,所以系统不需要任何处理,输出与msyql储存一致

=======================================================================================
jdbc连接中参数:serverTimezone=GMT%2B0 【+0】

Sun Apr 26 01:50:13 CST 2020
{“create_time”:1587837013000,”id”:3,”password”:”ww”,”username”:”w”}

这个时间戳表示的北京时间是 :2020-04-26 01:50:13

原本从数据库取出了2020-04-25 11:50:13,因为配置的是GMT+0,所以这个时间被认为是格林威治时间
由格林威治时间转为北京时间,就要在原基础上加8小时,所以系统输出加了八小时得到上面输出的结果

=======================================================================================

当我们使用springboot时,用了@RestController
例:
@GetMapping(“selectOne”)
public User selectOne(Integer id) {
return this.userService.queryById(id);
}
这样返回给前端的User对象,会由springboot使用jackson做json数据转换
输出:{“id”:3,”username”:”w”,”password”:”ww”,”create_time”:”2020-04-25T03:50:13.000+0000″}
时间的最后那段是:+0000

这个时间其实是正确的时间,只是使用了GMT+0的格林威治平时来表示了,也就是说格式不对

需要加个配置spring.jackson.time-zone=GMT+8

这样输出的时间就对了

=======================================================================================

发表评论