首先看一下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
这样输出的时间就对了
=======================================================================================