spring boot 使用 Mybatis 存储 日期格式时相差 14 小时的问题

本贴最后更新于 1849 天前,其中的信息可能已经时移世异

问题描述

今天在 spring boot 项目中遇到在使用 mybatis-generator 自动生成的 Example 进行保存用户信息时,发现存储在数据库中的创建时间和实际时间相差 14 个小时;下面记录一下问题出现的原因和解决的方法。

出现问题原因

spring boot mybatis 日期转化的时区和数据库时区不一致导致。

1. 查询数据库时区


show variables like '%time_zone%';
# 查询显示结果:
# system_time_zone: CST
# time_zone:SYSTEM

CST 可为 4 个不同时区的缩写,可参考 CST

  • 美国中部时间:Central Standard Time (USA)UT-6:00

  • 澳大利亚中部时间:Central Standard Time (Australia)UT+9:30

  • 中国标准时间:China Standard TimeUT+8:00

  • 古巴标准时间:Cuba Standard Time UT-4:00

2. 猜想 spring boot mybatis 转化日期格式使用的时区

猜想:com.mysql.cj.jdbc.Driver 转化 sql 的时候使用的时区是美国中部时间 UTC-06:00
猜想:mysql 数据库使用的是默认当地时区也就是中国标准时间 UTC+08:00
这样相加就可以得出时间相差 14 个小时

3. 解决方法

  • 修改数据库时区,需要重启数据库
set  global  time_zone = '+08:00';
set  time_zone = '+08:00';

设置成功后需要重启数据库

  • 链接数据库的链接上添加时区设置,不用设置数据库时区
spring.datasource.url=jdbc:mysql://localhost:3306/test?useTimezone=true&serverTimezone=GMT%2B8

意思是链接数据库的时候就设置时区 UTC+8

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    938 引用 • 1456 回帖 • 163 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 430 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...