java.util.Date转换为java.sql.Date带时分秒
java.util.Date需要转换为java.sql.Date,常规的方式转换过来只可以得到年月日,如若要取得时分秒,可以用Date的子类Timestamp
Java在向数据库中插入时间的时候,常常遇到时、分、秒丢失的情况,这种情况的发生一般是由于时间日期对象使用错误造成的。
java.util.Date是不能直接插入数据库中的,虽然它包含了日期和时分秒。java.sql.Date可以直接插入数据库,但是它只有日期而没有时间;java.sql.Time可以直接插入数据库,但是它只有时间,没有日期;以上这些往往不能满足我们的需要。
如果我们要插入日期和时间,那么就要相办法来使用java.sql.Timestamp来向数据库插入。java.sql.Timestamp可包含了日前和到毫秒的时间值,在程序中,我们常常是使用的java.util.Date,所以就要有解决的方法来实现。
有如下方法将java.util.Date转化为java.sql.Timestamp
public java.sql.Timestamp getTimestamp(Date date) {
return new java.sql.Timestamp(date.getTime());
}
这样,我们可以将我们使用的java.util.Date转化,然后插入数据库,便可以解决时、分、秒丢失的问题。
由此可以看到我们向数据库传入或传出值是尽量不要使用getDate方法或setDate方法,这样会丢失数据,解决的办法是:
一、改用java.sql.Timestamp
二、传日期形式的字符串,在存储过程接收到后在存储过程中使用to_date处理,对于输出的使用to_char处理
三、传TO_DATE字符串进存储过程
注意看这里的mm,mi。
需要用to_date,将字符转换成日期: to_date('2013-02-18 21:57:00','yyyy-mm-dd hh24:mi:ss') 比如: insert into table(col1,datecol) values(1,to_date('2013-02-18 21:57:00','yyyy-mm-dd hh24:mi:ss'))
一般插入数据库时,用上面这种方式。因为oracle不区分大小写,不用上面写方的话,会出现“格式出现两次的错误”
//package dao.impl; //import java.sql.ResultSet; //import java.sql.SQLException; //import java.util.ArrayList; //import java.util.Date; //import java.util.List; //import dao.RegDao; //import entity.Emp; // //public class RegDaoImpl extends BaseDao implements RegDao { // //@Override //public boolean add(Emp date) { //String sql = "insert into emp(userName,regDate)values(?,to_date(?,'yyyy-mm-dd hh24:mi:ss'))"; //这里如果是:to_date(?,'yyyy-mm-dd hh24:mm:ss'会是什么结果? // //int i = 0; //Object[] params = {date.getUserName(),date.getRegDate()}; //i = this.Update(sql, params); // //return false; //} // // //@Override //public List<Emp> getEmpsList() { //String sql = "select UserName,RegDate from emp"; //Object[] params ={}; //List<Emp> empList = new ArrayList<Emp>(); //ResultSet rs = this.Query(sql, params); //try { //while (rs.next()) { //Emp emp = new Emp(); //emp.setUserName(rs.getString("UserName")); //emp.setRegDate(rs.getString("RegDate")); // //; empList.add(emp); //} //} catch (SQLException e) { // //e.printStackTrace(); //} // //return empList; //} //public static void main(String[] args) { //RegDaoImpl daoImpl = new RegDaoImpl(); // //Date date = new Date(); // //Emp emp = new Emp(); //emp.setUserName("李四"); //emp.setRegDate(date.toLocaleString()); //daoImpl.add(emp); //List<Emp> List = daoImpl.getEmpsList(); //for (Emp emp2 : List) { //System.out.println(emp2.getUserName()+"\t" + emp2.getRegDate()); //} //} //} package dao.impl; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import dao.RegDao; import entity.Emp; public class RegDaoImpl extends BaseDao implements RegDao { @Override public boolean add(Emp date) { String sql = "insert into emp(userName,regDate)values(?,to_date(?,'yyyy-MM-dd hh-mi-ss'))";//注意看一下这里① int i = 0; Object[] params = {date.getUserName(),date.getRegDate()}; i = this.Update(sql, params); return false; } @Override public List<Emp> getEmpsList() { String sql = "select UserName,RegDate from emp"; Object[] params ={}; List<Emp> empList = new ArrayList<Emp>(); ResultSet rs = this.Query(sql, params); try { while (rs.next()) { Emp emp = new Emp(); emp.setUserName(rs.getString("UserName")); emp.setRegDate(rs.getString("RegDate")); ; empList.add(emp); } } catch (SQLException e) { e.printStackTrace(); } return empList; } public static void main(String[] args) { RegDaoImpl daoImpl = new RegDaoImpl(); Date date = new Date(); Emp emp = new Emp(); emp.setUserName("wtg"); SimpleDateFormat fomat = new SimpleDateFormat("yyyy-MM-dd hh-mi-ss"); //注意看这里② emp.setRegDate(fomat.format(date)); daoImpl.add(emp); List<Emp> List = daoImpl.getEmpsList(); for (Emp emp2 : List) { System.out.println(emp2.getUserName()+"\t" + emp2.getRegDate()); } } }
不过这里它却报出了一个java.lang.IllegalArgumentException: Illegal pattern character 'i'的异常,难道是它不认mi这个吗?它改mm却也还是报格式代码出现两次的异常。看来这也就是为何java API那里推荐使用Calendar类的原因了哦。
这里产生的两个结果不一样的。
select to_char(regDate, 'yyyy/mm/dd hh:mi:ss') from emp;
select to_char(regDate, 'yyyy/mm/dd hh:mm:ss') from emp;
,用这个列子来看就明白了
select to_char(sysdate, 'yyyy/mm/dd hh:mi:ss') from dual; select to_char(sysdate, 'yyyy/mm/dd hh:mm:ss') from dual;
得到的结果是:
使用select to_char(sysdate, 'yyyy/mm/dd hh:mi:ss') from dual;的结果是
TO_CHAR(SYSDATE,'YYYY/MM/DDHH:MI:SS') ------------------------------------- 2014/07/12 11:27:52使用select to_char(sysdate, 'yyyy/mm/dd hh:mm:ss') from dual;的结果是TO_CHAR(SYSDATE,'YYYY/MM/DDHH:MM:SS')
-------------------------------------
2014/07/12 11:07:56
可以看到,这里两个MM的值是月份
区别看这里的博客
http://blog.csdn.net/linlinv3/article/details/9815273
中的
2.日期到字符操作
select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual
select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual
select sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss') from dual
select sysdate,to_char(sysdate,'yyyy-mm iw-d hh:mi:ss') from dual