docker容器的时间和宿主机时间不一致相差8小时
原因:
new date()
调用的是jvm
时间,而jvm
使用的时间默认是0时区
的时间,即:和北京时间将会相差8小时。mybatis
将本地的数据传入到mysql
数据库服务器的时候,服务器会对数据进行检测,会把date类型
的数据自动转换为mysql
服务器所对应的时区,即0时区
,所以会相差8小时。springboot
中对加了@RestControlle
r或者@Controller+@ResponseBody
注解的方法的返回值默认是Json
格式,
所以,对date类型
的数据,在返回浏览器端时,会被springboot
默认的Jackson框架
转换,而Jackson框架
默认的时区GMT
(相对于中国是少了8小时)。所以最终返回到前端结果是相差8小时
针对这三个原因的解决方法分别是:
方法一:
- 在启动类的
main
方法里加上:
//(二选一即可,效果一样)
//设置时区为亚洲上海(即东八区)
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
//设置时区为标准0时区+8(即东八区)
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
如:
方法二:
- 在
yaml
文件的数据库驱动连接上配置:
url: jdbc:mysql://192.168.100.1:3306/link?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
如:
jdbc:mysql://localhost:3306/link: 这部分指定了数据库的连接方式和地址。jdbc 表示使用 JDBC 连接,mysql 表示使用 MySQL 数据库,localhost 是数据库服务器的地址,3306 是 MySQL 服务器的默认端口,link 是数据库的名称。
useUnicode=true&characterEncoding=UTF-8: 这两个参数指定了在与数据库通信时使用 Unicode 编码,并将字符编码设置为 UTF-8。
allowMultiQueries=true: 允许一次执行多个 SQL 查询。
useSSL=false: 禁用 SSL 连接,通常在开发环境中使用。
serverTimezone=Asia/Shanghai: 设置服务器时区为亚洲上海(GMT+8)。
- 如果还是不行,可以修改连接选项,如果是用
MyBatis
或MyBatisPuls
自动生成SQL
语句导致的,实测可以解决
方法三:
- 在
application.yml
中配置:
spring:
#解决前端取回日期少8个小时问题
jackson:
date-format: yyyy/MM/dd HH:mm:ss
time-zone: GMT+8
如:
如果以上还不能解决问题,可以尝试这篇文章:
docker容器的时间和宿主机时间不一致相差8小时