mybatis查询mysql的datetime类型数据时间差了14小时

今天使用mybatis查询mysql中的数据时,莫名其妙的所有时间都出错了,所有时间都比数据库时间多了14小时,考虑了一下,初步判定是系统时区的问题。因为mysql时区设置默认是操作系统时区,查看了下centos时区,东8区没有错,所以可以判定是代码里面设置了一个错误的时区。

现在开始调试mybatis源码,调试到mysql-connector-java-6.0.4.jar包的com.mysql.cj.jdbc.io.JdbcTimestampValueFactory的createFromTimestamp方法时,发现mysql的底层驱动程序对从数据库查询出来的时间用了一个Calender做类型转换,Calender记录中包含的时区为CST,跟中国的时区Asia/Shanghai正好差了14小时。

那么为什么mybatis连接数据库会使用CST的美国时间呢?继续查看源码发现

mysql连接数据库的时候会从mysql读取系统的时区设置,调试com.mysql.cj.mysqla.MysqlaSession.java的configureTimezone方法发现,this.getServerVariable("system_time_zone")从系统里面读出来的时区设置是CST

至此问题已经清楚了,是mysql设置的时区不对,登陆linux,执行mysql -uroot -p, 然后运行命令show variables like ‘%time_zone%‘,发现system_time_zone项果然是CST。

至此,排查问题结束,修改一下mysql的时区设置即可。

作者:许武顺
链接:https://www.jianshu.com/p/ea7ef2d29940
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/bignode/p/9310893.html

时间: 2024-11-07 13:01:44

mybatis查询mysql的datetime类型数据时间差了14小时的相关文章

开发查询mysql的datetime类型数据时间差了14小时解决

今天开发在测试环境上调试代码的时候发现mysql数据库查出来的时间都错了.所有时间都比数据库时间多了14小时.初步判断是时区的问题.因为mysql时区设置默认是操作系统时区,查看了下centos时区,东8区没有错,所以可以判定是代码里面设置了一个错误的时区. [[email protected] ~]# date -R Sat, 13 Apr 2019 21:01:46 +0800 开发调试代码.发现时区为CST,跟中国的时区Asia/Shanghai正好差了14小时. 那么为什么mybatis

用js解析经json序列化后的C#的DateTime类型数据

用js解析经json序列化后的C#的DateTime类型数据 (2012-09-21 19:36:03) 转载▼ 标签: 杂谈 分类: javascript // val为经json直接序列化后的C#的DateTime类型的数据function formatTime(val) {    var re = /-?\d+/;    var m = re.exec(val);    var d = new Date(parseInt(m[0]));// 按[2012-02-13 09:09:09]的格

C# 使用linq处理返回带datetime类型数据 json显示/date(xxxxx)/

以前做项目一直遇到带数据库里面带datetime类型数据 返回到前台会变成时间戳 这显然不是我们想要的 于是我在最初的项目中 选择在前端JS格式化date(xxxx)形式的方式处理 现在想来有点蠢 今天灵机一动 想到是不是可以在服务端就把datetime转成string返回到 结果就有了此文 服务端: 1 DataGetEntities context = new DataGetEntities(); 2 var queryTyphoon = context.T_TyphoonPaths.Whe

mybatis查询mysql的时间段

mapper文件的写法为:(模糊查询,查询时间段) <if test="com_name!=null and com_name!=''"> and sc.com_name like CONCAT(CONCAT('%',#{com_name}),'%') </if> <if test="check_begin_date!=null and check_begin_date!=''"> <![CDATA[ and DATE_FO

解决python中转化成json的方法不能序列化datetime类型数据(转)

Python自带的json.dumps方法序列化数据时候如果格式化的数据中有datetime类型数据时候会提示错误TypeError: datetime.datetime(2012, 12, 12, 15, 47, 15) is not JSON serializable 搜索出来的解决方案基本都是用Django的DjangoJSONEncoder来解决,为了一个简单的办法引入Django这个大家伙实在有点不知所谓.不过这一点就体现了Django的资料多的优势了 正在下决心是否干脆下载了Djan

Mybatis查询Mysql datetime类型时,相差8小时 解决方案

查出来的数据跟数据库里的数据相差了8个小时,这是为什么呢? 这是因为Mysql 使用系统默认时区,东八区. 而Tomcat java使用UTC时区进行处理业务逻辑. 时区的不同,从而导致Mysql数据库中datetime类型的值查询后转到Java Bean,值多了8个小时. 解决方法 在url后面添加 serverTimezone=Asia/Shanghai : jdbc.url=jdbc:mysql://127.0.0.1:3306/caipiao?useUnicode=true&charac

mysql存取blob类型数据

参考网址:http://www.cnblogs.com/jway1101/p/5815658.html 首先是建表语句,需要实现将表建立好. CREATE TABLE `blobtest` ( `primary_id` varchar(32) NOT NULL, `bank_id` varchar(32) NOT NULL, `bank_name` varchar(64) NOT NULL, `blob_data` blob NOT NULL, PRIMARY KEY (`primary_id`

json序列化datetime类型数据

错误描述: import jsonimport datetime a = datetime.datetime.now()print(a) b = json.dumps(a)print(b) 如上代码,执行会报错: TypeError: datetime.datetime(2017, 2, 5, 10, 27, 48, 155328) is not JSON serializable 因为datetime类型的数据无法直接用json序列化. 解决办法: class CJsonEncoder(jso

JavaScriptSerializer序列化成Json时DateTime类型数据的处理

JavaScriptSerializer在序列化时会将DateTime的数据序列化成类似\/Date(626543800000)\/这样的值,找了很多方法都不如意,最后在一个博客找到了完美的解决方法,地址:http://blog.calyptus.eu/seb/2011/12/custom-datetime-json-serialization/,通过自定义类型转换器的方式转换成想要的格式,转换器代码如下: + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1