String类型日期转换到java.sql.Date(另包含util和sql包Date我遇到的坑)

背景:比如新员工入职需要记录日期,创建数据表的时候你选择date或者datetimejava中处理方式是一样的,只不过前者精确到天,后者精确都秒。
  当你进行preparedStatement.setDate(5, sdHiredate);的时候,这个sdHiredate就是要java.sql.Date包下的date,但是我们输入的入职日期只是字符串"2020-01-01",怎么样从字符串转换到java.sql.Date下的日期参数呢?


从背景中我们提取出的问题如下:
怎么样从输入的String类型日期转换到java.sql.Date包下的日期参数?


2个步骤
1.先String转为 java.util.Date
2.再将java.util.Date转为java.sql.Date,方法是获取自1970年到现在的毫秒数,这样就可以根据毫秒数生成相同的时间


千万别直接强制类型转化了把java.util.Date强转到java.sql.Date,虽然java.sql.Date继承自java.util.Date
在这里插入图片描述
但是直接强转还是会报错

Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
	......
	.....
	.....

具体正确的做法如下:

		// 1.String转为 java.util.Date
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date udHiredate = null;
        try {
            udHiredate = simpleDateFormat.parse(strHiredate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        // 2.java.util.Date转为java.sql.Date
        long time = udHiredate.getTime();// 获取自1970年到现在的毫秒数
        java.sql.Date sdHiredate = new java.sql.Date(time);

实际中我也遇到过一个坑,数据库建表是有日期Date的,然后我在bean对象里面成员变量也有Date去对应,但是这里我却错误的导入的util包的Date,导致后续插入操作时,logback一直提示插入成功,但是忽略了一个SQLWarningSQL state '22007', error code '1292'

16:13:42.185 [main] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL update
16:13:42.186 [main] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [insert
 into employee(eno,ename,salary,dname,hiredate) values(?,?,?,?,?)]
16:13:42.226 [main] DEBUG org.springframework.jdbc.core.JdbcTemplate - SQLWarning ignored: SQL state '22007', 
error code '1292', message [Incorrect date value: '2021-01-26 16:13:42.183' for column 'hiredate' at row 1]

后来才发现是Date导入包导错了,而且bean对象的日期Date也应该是sql包的。

bean对象的getter和setter改为

// import java.util.Date;这里原来错写成util包的Date
	import java.sql.Date;
	......
    public Date getHiredate() {
        return hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

最后设置入职日期将
import java.util.Date;
......
employee.setHiredate(new Date());

改为了

import java.sql.Date;
employee.setHiredate(new Date(new java.util.Date().getTime()));

然后logback日志就干净多了


欢迎一键三连~

有问题请留言,大家一起探讨学习

----------------------Talk is cheap, show me the code-----------------------
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页