spring mvc + mybatis + mysql 保存的时间少了8个小时

发布于 2022-09-05 10:56:44 字数 3635 浏览 50 评论 0

项目构成:spring mvc + mybatis + mysql5.7 + jdk8
使用mysql5.7是为了存储json格式数据
使用jdk8新的日期API LocalDateTime now = LocalDateTime.now(); 获取当前时间并保存到数据库。但是发现在mysql中实际存储的时间比当前正确的时间少了8个小时。
处理过程
1、代码问题,跟踪调试,在保存到数据库之前的时候,对象中保持的时间还是正确的

clipboard.png

2、怀疑是系统时区问题,排查本机系统,服务器系统,数据库系统等电脑系统时区都是东八区没问题
3、查询资料,发现mysql也有自己的时区设置
http://blog.csdn.net/mchdba/a...
http://www.jianshu.com/p/ea7e...
首先在mysql查看时间有没有问题

clipboard.png

发现没有问题,但是我还是按资料操作修改时区设置,包括命令修改和修改my.ini配置文件都没有解决问题。
my.ini内容:


[mysqld]

basedir = D:\mysql-5.7.19-winx64
datadir = D:\mysql-5.7.19-winx64\data
port = 3306

default-time-zone = '+8:00'

其中时区设置是刚刚加上的。

上面排查到第3步的时候,我在查询自己的mysql时区的时候发现参数system_time_zone是空的,并且有一个警告,且查找资料无法解决:
http://blog.csdn.net/shiyong1...

clipboard.png

整体感觉没有奇怪,每台机器的时区设置都一样,项目或者mysql本身也没有配置时区参数的问题,数据保存到数据库之前时间没问题,mysql本身设置好像也没问题,但是数据保存完以后却不正常。

clipboard.png

08-23早上补充
mybatis 控制台sql打印内容

DEBUG [ 2017-08-23 10:02:33 549 ]: org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:145) - ==>  Preparing: insert into log_user_operation (pk_id, user_code, user_name, login_ip, url, operation_type, operation_content, remark, create_time) values (?, ?, ?, ?, ?, ?, ?, ?, ?) 
DEBUG [ 2017-08-23 10:02:33 588 ]: org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:145) - ==> Parameters: null, admin(String), Admin(String), 127.0.0.1(String), http://localhost:8080/bi/login-check(String), SELECT(String), 用户登录(String), (String), 2017-08-23 10:02:33.022(Timestamp)
DEBUG [ 2017-08-23 10:02:33 600 ]: org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:145) - <==    Updates: 1
DEBUG [ 2017-08-23 10:02:33 604 ]: org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:145) - ==>  Preparing: SELECT LAST_INSERT_ID() 
DEBUG [ 2017-08-23 10:02:33 605 ]: org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:145) - ==> Parameters: 
TRACE [ 2017-08-23 10:02:33 642 ]: org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:151) - <==    Columns: LAST_INSERT_ID()
TRACE [ 2017-08-23 10:02:33 643 ]: org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:151) - <==        Row: 39
DEBUG [ 2017-08-23 10:02:33 646 ]: org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:145) - <==      Total: 1
DEBUG [ 2017-08-23 10:02:33 652 ]: org.mybatis.spring.SqlSessionUtils.closeSqlSession(SqlSessionUtils.java:193) - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3a8a10a7]

数据库实际结果

clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

忆伤 2022-09-12 10:56:44

困扰了两天的问题,今天晚上终于解决了。
经历多次修改数据库配置,重新在一台新的服务器上配置新的MySQL服务等等尝试都没有解决问题。今天晚上心血来潮尝试用最原始的Java代码使用JDBC驱动,看看是否会出现相同的情况。结果竟然还是一样的问题。
但是!!!在写Java代码的时候,无意中发现连接数据库的url中有配置serverTimezone=UTC,顿时感觉会不会就是这个问题导致的。
这里暂停说明一下:因为用的是相对最新版的5.7版本MySQL以及相对应的新版驱动jar包v6.0.6,因此这里的driver和url写法与以前的不太一样。
这是最新版驱动包相对于的写法配置

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/ss?characterEncoding=utf8&useSSL=true&serverTimezone=UTC&nullNamePatternMatchesAll=true

而以前版本的url写法只要jdbc:mysql://localhost:3306/ss 就够了。
好了,重新回到问题。
我从突破点serverTimezone=UTC中的UTC时区问题去查资料,终于发现一位博主的一篇帖子有过说明。根据帖子里的相关说明,修改为serverTimezone=Hongkong成功解决问题!
心里默默感激下那位博主,同时吐槽下MySQL这坑爹的配置问题

抹茶夏天i‖ 2022-09-12 10:56:44

我记得LocalDateTime这个类是不处理时区的。如果你需要存储时区的内容,可以考虑使用ZonedDateTime(https://docs.oracle.com/javas...

ZonedDateTime now = ZonedDateTime.now()
忆梦 2022-09-12 10:56:44

看你的设置没什么问题,你把你的sql打印出来拿到mysql手动执行再看一下,还有你最后一张图系统时间16:47为什么你表里已经有8:50的记录了呢,并不足8小时,说明可能跟东八区并没有关系

鸵鸟症 2022-09-12 10:56:44

看执行的sql语句

讽刺将军 2022-09-12 10:56:44

对于这种的,最好是记录时间戳,然后通过SimpleDateFormat类来进行日期格式化

Smile简单爱 2022-09-12 10:56:44

我也遇到了,我是直接new Date(),这问题坑爹啊,楼主解决了的话,求答案

凹づ凸ル 2022-09-12 10:56:44

很赞那,解决了困扰我好几日的问题

默嘫て 2022-09-12 10:56:44

点赞,完美的解决了,我的问题。谢谢博主。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文