docker容器的时间和宿主机时间不一致相差8小时
原因:
new date()调用的是jvm时间,而jvm使用的时间默认是0时区的时间,即:和北京时间将会相差8小时。mybatis将本地的数据传入到mysql数据库服务器的时候,服务器会对数据进行检测,会把date类型的数据自动转换为mysql服务器所对应的时区,即0时区,所以会相差8小时。springboot中对加了@RestController或者@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小时
本文讨论了Docker容器时间与宿主机时间不一致的问题,原因在于jvm和MySQL服务器默认使用0时区,SpringBoot的Json处理默认时区为GMT。提供了三种解决方案:设置全局时区、数据库连接配置时区和SpringBootJackson配置。
的所有解决方法,看这篇就够了&spm=1001.2101.3001.5002&articleId=134557163&d=1&t=3&u=71bd7479b7e54c7cac0cf44ae4ce6423)
1万+

被折叠的 条评论
为什么被折叠?



