【java】java如何保留时分秒存取mySql中的datetime类型数据的方法 及 显示时间与数据库存放时间相差n小时的解决方法
〇、前情提要Date数据存入mysql数据库后,时分秒消失不见,归为0。参考:一、问题描述console在java里Date date = new Date();后得到的uploadtime=Wed Nov 11 16:56:12 CST 2020, offtime=Wed Nov 11 16:56:12 CST 2020数据库数据库中16:56:12消失二、三、四、五、...
〇、前情提要
Date数据存入mysql数据库后,时分秒消失不见,归为0。
参考:
- java日期格式Date,Timestamp存入数据库
https://www.cnblogs.com/shelly0307/p/10420303.html - java.sql.Date和java.util.Date区别及使用
https://blog.csdn.net/maoyuanming0806/article/details/78011700 - Java 如何存取MySQL datetime类型
https://www.cnblogs.com/latiny/p/8613352.html
一、问题描述
console
在java里Date date = new Date();后得到的uploadtime=Wed Nov 11 16:56:12 CST 2020, offtime=Wed Nov 11 16:56:12 CST 2020
数据库
数据库中16:56:12消失
说明:java.sql.Date 只存储日期数据不存储时间数据
二、java.sql.Date和java.util.Date区别
原文:
java.sql.Date和java.util.Date区别及使用
https://blog.csdn.net/maoyuanming0806/article/details/78011700
java.sql.Date是java.util.Date的子类

三个类都是对应与jdbc处理日期格式的类,有不同的日期精度和格式
日期格式
java.sql.Date只包含年月日信息,YYYY-MM-DD。
当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。
如果你是 2017-09-17 15:15:25 这样的时间点存取数据,那么存在数据库中的值就是:2017-09-17 00:00:00
类型转换
如果把java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的java.sql.Date规范化,非规范化的部分将会被劫取。
然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).
显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值,我们需要利用java.sql.Timestamp.
注:假若sqltime是java.sql.Date类型对象、utiltime是java.util.Date类型对象
java.util.Date 转 java.sql.Date
java.sql.Date s = new java.sql.Date(util.getTime());
java.sql.Date 转 java.util.Date
java.util.Date u = sqltime;
注意:给java.util.Date赋值java.sql.Date,会自动舍去时分秒。
三、java获取Timestamp类型的当前系统时间 格式:yyyy-MM-dd HH:mm:ss
原文:
java日期格式Date,Timestamp存入数据库
https://www.cnblogs.com/shelly0307/p/10420303.html
方法1:
Timestamp t = new Timestamp(System.currentTimeMillis());
preparedStatement.setTimestamp(1,t);
方法2:
Date date = new Date();
Timestamp t= new Timestamp(date.getTime());
preparedStatement.setTimestamp(1,t);
方法3:
java.util.Date d = new java.util.Date(resultSet.getTimestamp(1).getTime());
四、在DaoImpl层实践
代码
Connection conn = DBUtil.getConnection();
String sql = " ";
try {
PreparedStatement prep = conn.prepareStatement(sql);
prep.setTimestamp(6, new java.sql.Timestamp(new java.util.Date().getTime()));
prep.setTimestamp(7, new java.sql.Timestamp(new java.util.Date().getTime()));
prep.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtil.close(conn);
}

成功

为什么间隔了两天才处理这个问题呢?因为我去当工具人了…日行一善…给自己攒人品吧。
五、将数据从mysql数据库中取出来后显示时分秒
参考:
Java 如何存取MySQL datetime类型
https://www.cnblogs.com/latiny/p/8613352.html
提取数据
如果要从MySQL中获取yyyy-MM-dd HH:mm:ss 日期格式,首先必须使用 rs.getTimestamp(“insert_dt”)方法,其中"insert_dt" 是数据库时间字段,类型为datetime;然后通过SimpleDateFormat 时间格式化类,将取出来的时间转为String类型
-
先来对比rs获取不同日期时间格式的方法
System.out.println(rs.getDate(“insert_dt”));
System.out.println(rs.getTime(“insert_dt”));
System.out.println(rs.getTimestamp(“insert_dt”)); -
输出结果:
2018-03-19
22:03:21
2018-03-19 22:03:21.0 -
可以看到通过getTimestamp获取的日期格式最后还有一位数(2018-03-19 22:03:21.0),需要将rs.getTimestamp(“insert_dt”) 转为String类型
String timeStamp = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(rs.getTimestamp(“insert_dt”));
System.out.println(timeStamp); -
输出结果:
2018-03-19 21:51:57
在DaoImpl层实践
与显示相关的是在DaoImpl层里写的查询方法
public List<media> findAllMedia(int sysType) {
//1.获取连接
String sql = "你的sql语句";
Connection conn = DBUtil .getConnection();
// 创建集合,存储所有查询内容
List<media> ms = new ArrayList<media>();
try {
PreparedStatement prep = conn.prepareStatement(sql);
// 执行sql语句 得到结果集rs
ResultSet rs = prep.executeQuery();
// 处理结果集,遍历获得每条通讯录记录并存储到集合中保存,返回
while(rs.next()) {
// Date uploadtime = rs.getDate("uploadtime");
// Date offtime = rs.getDate("offtime");
// m.setUploadtime("uploadtime");
// m.setOfftime("offtime");
m.setUploadtime(rs.getTimestamp("uploadtime"));
m.setOfftime(rs.getTimestamp("offtime"));
//将上述查到的数据封装到al上
ms.add(m);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.close(conn);
}
return ms;
}
在html中实践
例子为在表格中显示时间
<%String uploadtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(m.getUploadtime()); %>
<td><%=uploadtime %></td>
测试
可以成功显示
六、新的问题
显示时间与数据库里的时间不符


比较数据
日期一样时间相差八小时
参考:
关于从数据库获取DateTime数据少了八个小时/N个小时的问题
https://blog.csdn.net/Utaokii/article/details/109612269
解决方式:在连接数据库时设置时区
jdbc:mysql://localhost:3306/sqzp?useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT&useSSL=true
//将其中 serverTimezone=GMT 改为 serverTimezone=Asia/Shanghai 即可
jdbc:mysql://localhost:3306/sqzp?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai&useSSL=true
读取到的时间变为正确
测试上传时间是否能对应
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)