mysql jdbc 日期_MySql 时间类型 & JDBC时间类型

再次查询MariaDB [test]> select * from timestamp_n_datetime

-> ;

+----+---------------------+---------------------+

| id | ts | dt |

+----+---------------------+---------------------+

| 1 | 2018-03-11 06:35:01 | 2018-03-11 14:35:01 |

+----+---------------------+---------------------+

1 row in set (0.00 sec)

TIMESTAMP存储的时间调整到了新时区,而DATETIME存储的时间不变。刚接触java的时候写代码的就出现过时区问题,mybatis mysql,表字段类型为DATETIME,java类型为java.util.Date。通过查看java connector源码com.mysql.cj.mysqla.MysqlaSession.java的configureTimezone方法,this.getServerVariable("system_time_zone")

调试这里发现从系统里面读出来的时区设置是CST。于是去查找数据库服务器的原因MariaDB [(none)]> show variables like ‘%time_zone%‘;

+------------------+--------+

| Variable_name | Value |

+------------------+--------+

| system_time_zone | CST |

| time_zone | SYSTEM |

+------------------+--------+

2 rows in set (0.01 sec)

解决方法:修改配置文件 /etc/my.cnf.d/server.cnf (centos 7),需要重启mysql# this is only for the mysqld standalone daemon

[mysqld]

default-time-zone=‘+08:00‘ # 将这行加到mysqld节点下

修改数据库服务变量(未验证,如果不方便修改配置文件或重启数据库。重启数据库之后失效??)set time_zone=‘+08:00‘;

set global time_zone=‘+08:00‘;

flush privileges;

如果是直接使用jdbc而不是mybatis,则通过java.util.Date now = new java.util.Date();

java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(now.getTime());

PreparedStatement.setTimestamp(1, sqlTimestamp, Calendar.getInstance(Locale.CHINA));

即指定第三个参数。如果没有指定第三个参数,则又使用了CST时间(setTimestamp源码中)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值