〇、前情提要

Date数据存入mysql数据库后,时分秒消失不见,归为0。
参考:

  1. java日期格式Date,Timestamp存入数据库
    https://www.cnblogs.com/shelly0307/p/10420303.html
  2. java.sql.Date和java.util.Date区别及使用
    https://blog.csdn.net/maoyuanming0806/article/details/78011700
  3. 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

读取到的时间变为正确
在这里插入图片描述

测试上传时间是否能对应在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐