标签:https 结果 etc java ati 写代码 服务 种类型 art
长度
时区
DATETIME存储的时间不包含时区
TIMESTAMP存储的UTC时间
例如:
create table
CREATE TABLE timestamp_n_datetime (
id INT AUTO_INCREMENT PRIMARY KEY,
ts TIMESTAMP,
dt DATETIME
);
insert now(当前时区为+08)
insert into timestamp_n_datetime(ts,dt) values (now(), now());
select
MariaDB [test]> select * from timestamp_n_datetime;
+----+---------------------+---------------------+
| id | ts | dt |
+----+---------------------+---------------------+
| 1 | 2018-03-11 14:35:01 | 2018-03-11 14:35:01 |
+----+---------------------+---------------------+
1 row in set (0.00 sec)
修改时区
MariaDB [test]> set time_zone = ‘+00:00‘;
Query OK, 0 rows affected (0.02 sec)
再次查询
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源码中)
这一节的资料有点老(https://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/jdbc/getstart/mapping.doc.html)
这三种类型都继承自java.util.Date,因为java.util.Date没法匹配三种JDBC时间类型。
DATE表示只包含了年月日的时间类型 java.sql.Date for SQL DATE(这里的SQL说的是SQL-92标准)。 父类的hour, minute, second, millisecond字段被设置为0。
TIME表示只包含了时分秒的时间类型 java.sql.Time for SQL TIME information. 父类的year, month, day字段被设置为1970, 1月, 1号. 这个时间是java里面的“零纪元”
TIMESTAMP包含了DATE+TIME再加上一个纳秒(nanosecond)字段 java.sql.Timestamp for SQL TIMESTAMP information. 这个类型为java.util.Date扩展了额外的nanosecond字段。
SELECT @@global.time_zone, @@session.time_zone;
如果查询结果是SYSTEM,表示mysql服务器使用了系统时区 date -R
命令能查看系统时区。标签:https 结果 etc java ati 写代码 服务 种类型 art
原文地址:https://www.cnblogs.com/gdme1320/p/9061283.html