1、如何在Mysql数据库中以“yyyy-MM-dd HH:mm:ss”形式保存时间
有时我们需要在Mysql数据库中以“yyyy-MM-dd HH:mm:ss”形式保存时间。首先我们可以将字段定义为Timestamp类型。这样在JDBC中保存时间时也同样需要以Timestamp形式保存。
比如:我们定义了这样一张表:
CREATE TABLE `news` (
nid int(11) NOT NULL AUTO_INCREMENT,
title varchar(200) NOT NULL,
author varchar(200) NOT NULL,
pubdate timestamp NULL DEFAULT CURRENT_TIMESTAMP,
content longtext NOT NULL,
lockflag int(11) DEFAULT '1',
) ;
其中pubdate字段保存时间,类型为Timestamp。当我们需要使用JDBC向表中插入数据时,可定义create()方法如下:
public boolean doCreate(News news) throws Exception {
boolean flag = false;
String sql = "INSERT INTO news(title, author, pubdate, content, lockflag) VALUES(?,?,?,?,?)";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setString(1, news.getTitle());
this.pstmt.setString(2, news.getAuthor());
this.pstmt.setTimestamp(3, new java.sql.Timestamp(news.getPubdate().getTime())); // 默认为系统当前时间
this.pstmt.setString(4, news.getContent());
this.pstmt.setInt(5, news.getLockflag());
if (this.pstmt.executeUpdate() > 0) {
flag = true;
}
this.pstmt.close();
return flag;
}
因为News实例中的时间为java.util.Date类型,因此在添加到数据库前需要先转成java.sql.Timestamp类型。
2、如何把从数据库中读取的时间以“yyyy-MM-dd HH:mm:ss”形式显示
首先从数据库中取出pubdate字段值,然后保存在News实例news中:news.setPubdate(new java.util.Date(rs.getTimestamp(4).getTime()))。如果此时直接输出,则会以默认方式显示,比如:Thu Mar 12 21:48:57 CST 2020。这样并不符合常规的习惯,要将它以“yyyy-MM-dd HH:mm:ss”形式显示。还需要转换一下,首先定义java.text.SimpleDateFormat实例:SimpleDateFormat dateFromat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")。然后调用方法dateFormat.format(news.getPubdate()),会返回一个以“yyyy-MM-dd HH:mm:ss”形式表示时间的字符串。
经过这样一番操作就可以得到我们想要的时间格式,但是我们发现MySql从数据库中查出时间数据比实际时间晚八个小时。这是因为我们进行数据库连接时将DBURL定义成了:"jdbc:mysql://localhost:3306/mldnuseSSL=true&serverTimezone=UTC,其中serverTimezone为UTC,而中国大陆是在东八区,也就是比UTC多了八个小时(详情可以查阅UTC相关知识)。因此我们将参数修改为:serverTimezone=Asia/Shanghai, 就OK了!