Mysql的时间问题:插入和取出不一致(设置时区)

今天遇到一个阴间问题。

问题描述

拟有表结构如下:

  • id ——(自增id)
  • uuid ——(唯一标识符id)
  • content ——(表的内容,不做讨论)
  • createTime ——(DateTime类型)
  • updateTime ——(DateTime类型)

现在有这样一个业务需求,让你根据UUID从mysql中取出一条信息的update信息。Mybatis可以提供Timestamp类型来对应Mysql中的DateTime类型,在取出DateTime类型的数据的时候可以自动转型为Timestamp类型。于是你开始写代码:

Interface代码如下:


public Timestamp getUpdateTime(@Param("UUID") String UUID);

Mapper代码如下:

<select id="getUpdateTime" resultType="java.sql.Timestamp">
        select updateTime from XXX where UUID = #{UUID};
    </select>

你针对Interface代码进行单元测试,然后你发现,通过mybatis取出来的时间戳结果和你单独运行sql语句取出来的时间戳不相同。你打开mysql终端:

mysql> select updateTime from XXX where UUID = "..."; 

+---------------------+
| updateTime          |
+---------------------+
| 2020-07-23 15:12:40 |
+---------------------+
1 row in set (0.00 sec)

然后你再去Interface的单元测试打印通过Mybatis取出来的时间戳,他的结果竟然是:

...
2020-07-23 15:20:31.363  INFO 23263 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-07-23 15:20:31.943  INFO 23263 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.

2020-07-24 04:12:40.0

日期变了,小时数变了,可是分秒数都没有变——第一反应就是时差。

检查一下连接mysql的jdbc驱动url(如果是Springboot项目,在application.yml文件中配置):

url: jdbc:mysql://localhost:3306/XXX

加上时区后缀,将其更改为:

url: jdbc:mysql://localhost:3306/XXX?serverTimezone=CTT

问题解决。

其他插入时间和取出时间不一致的问题也可以参考类似的思路,mysql的时区设置确实是一个容易忽视的点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值