前提背景1.mysql-connector-java的版本号8.0.21
1.在北京时间【Thu Dec 16 19:25:46】---timestamp【1608117946】往表里面插进一条时间数据,
jdbc参数serverTimezone=Asia/Shanghai
2.建立DTO,属性为Date的类型 【LocalDateTime的数据类型的话,值是一直不变】
3.从表里查那个时间数据
结果
1.设置jdbc参数serverTimezone=UTC
查出来的结果是【Thu Dec 17 03:25:46】【时区为北京时区】
2.设置jdbc参数serverTimezone=IST
查出来的结果是【Wed Dec 16 21:55:46】【时区为北京时区】
3.设置jdbc参数serverTimezone=Asia/Shanghai
查出来的结果是【Thu Dec 16 19:25:46】 【时区为北京时区】
个人猜测
mysql存储到硬盘的时间为时间戳【1608117946】
再根据serverTimezone的时间转为需要的时间。
serverTimezone的取值规律
1.先取jdbc:mysql://localhost:3306/***?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC
上serverTimezone的值
2.取mysql实例上time_zone的值
3.但是如果time_zone的值是SYSTEM ,那就取mysql实例上system_time_zone 的值
源码【版本号8.0.21】出处:类:com.mysql.cj.protocol.a.NativeProtocol #方法->configureTimezone
源码【版本号5.1.41】出处:类:com.mysql.jdbc.ConnectionImpl #方法->configureTimezone
时间转换问题
java的mysql驱动把timetsamp和datetime都转了
navicat的timestamp转,datetime没转
set time_zone = '+6:00';
SELECT * FROM user;
show VARIABLES like '%zone%';
user下分别有一个timestamp的数据和datetime的数据,测试一下就知道了
个人猜测
timestamp是mysql转的
datetime是java驱动转的
相关的链接
http://www.cocoachina.com/articles/52294
https://blog.csdn.net/ysy950803/article/details/88578892
https://juejin.cn/post/6844903476225376264
网友评论