java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间

java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。

java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许 JDBC 将毫秒值标识为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。 为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。

说白了,java.sql.Date就是与数据库Date相对应的一个类型,而java.util.Date是纯java的Date。

从类 java.util.Date 继承的方法

after, before, clone, compareTo, equals, getDate, getDay, getMonth, getTime, getTimezoneOffset, getYear, hashCode, parse, setDate, setMonth, setYear, toGMTString, toLocaleString, UTC

sql.Date也有时间的

如果不想用oracle的to_date函数,可以自己生成sql.Date对象

String s = "2012-06-21 00:10:00";

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

java.util.Date d1 = sdf.parse(s); //先把字符串转为util.Date对象

java.sql.Date d2 = new java.sql.Date(d1.getTime()); //再转换为sql.Date对象

想要将带时分秒的时间插入到数据库中,除了Oracle数据库的to_date()方法之外。我们可以用 Timestamp类来实现。java.sql.Date是规范化之后的时间,其时分秒部分被截取掉了。

java.sql.Date是为了配合SQL DATE而设置的数据类型。“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被劫取。

在sun提供的ResultSet.java中这样对getDate进行注释的:

Retrieves the of the designated column in the current row of this <code>ResultSet</code> object as a “java.sql.Date” object in the Java programming language.

同理。如果我们把一个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.

eg:

[java] view plaincopy

<span style="font-size:18px;">  String s="2012-01-02 03:12:21";

SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

java.util.Date du = sp.parse(s);

java.sql.Timestamp st = new java.sql.Timestamp(du.getTime());</span>

把一个日期值写入数据库中,发现由java.util.Date转存为java.sql.Date后,只有年月日,没有了时分秒:

java.util.Date ud = new java.util.Date();

java.sql.Date sd = new java.sql.Date(ud.getTime());

这个可是不行的,用户至少要精确到分。由于java.sql.Date为了能够遵守sql日期标准,把所有时分秒都归了零。只有用Timestamp来进行保存,由于Timestamp是子类,因此写好的bean里面不需要修改数据类型。

pstmt.setTimestamp(15, new java.sql.Timestamp(Calendar.getInstance().getTime().getTime()));  //当前时间

pstmt.setTimestamp(16, new java.sql.Timestamp(userFile.getCreateTime().getTime()));  //指定时间

对于指定时间还可以用Calendar类的setTime()方法来设置

[java] view plaincopy

<span style="font-size:18px;">Calendar cal = Calendar.getInstance();

System.out.println(cal.getTime().getTime());

String string="2012-01-01 01:02:03";

SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

java.util.Date da = sp.parse(string);

cal.setTime(da);

System.out.println(cal.getTime().getTime());</span>

在数据库中插入带时分秒的时间需要用Timestamp。一般做这种操作用框架居多,我就说一下Hibernate吧。在数据库表中字段类型设置为Date数据类型,代码中映射的字段类型设置为 Timestamp类型, private Timestamp date;  在映射文件中 <property name="date" type="timestamp" column="sj"/> Type也是时间戳类型的。在赋值取值的时候用前面的操作获取到需要的时间的时间戳对象直接赋值就行。然后就可以用Hibernate执行方法将带时分秒的时间存入到数据库里了。(不过这一点意义好像不是很大,大多都是直接varchar2存进去,取时候再to_date一下或者在代码里处理)

还需要说一点的就是

在使用SimpleDateFormat时格式化时间的 yyyy.MM.dd 为年月日而如果希望格式化时间为12小时制的,则使用hh:mm:ss 如果希望格式化时间为24小时制的,则使用HH:mm:ss,上代码:

[java] view plaincopy

SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//12小时制

[java] view plaincopy

SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制

[java] view plaincopy

Date d = new Date();

SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//12小时制

System.out.println(ss.format(d));

Date date = new Date();

SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制

String LgTime = sdformat.format(date);

System.out.println(LgTime);

结果为

2008-05-28 01:32:54

2008-05-28 13:32:54

Date类,已经很少用了。更多使用的是Calendar

Calendar    date    =    Calendar.getInstance();

date.get(Calendar.HOUR_OF_DAY    );//得到24小时机制的

date.get(Calendar.HOUR);//    得到12小时机制的

时间: 2024-12-11 08:32:59

java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间的相关文章

用java向mysql数据库中插入数据为空

利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util.Scanner; import org.junit.Test;public class JDBCTest { //2).在测试方法testAAddStudent()中 //1.获取从控制台输入的Student对象:Student student=getStudentFromConsole(); /

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结 转

java.util.Date.java.sql.Date.java.sql.Time.java.sql.Timestamp区别和总结 java.lang.Object ....|__java.util.Date ..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time [父类]java.util.Date日期格式为:年月日时分秒 [子类]java.sql.Date日期格式为:年月日[只存储日期数据不存储时间数据] [子类]java.

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和联系

参考:链接 在Web开发中,避免不了对日期的操作,常用的关于时间的类有这么几个: java.util.Date.java.sql.Date.java.sql.Time.java.sql.Timestamp,这几个类在JDK的定义如下所示: java.lang.Object -.|__java.util.Date ---.|__java.sql.Date/java.sql.Timestamp/java.sql.Time -.|__java.security.Timestamp java.util.

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结

java.sql.Date.java.sql.Timestamp区别和总结 java.lang.Object ....|__java.sql.Date/java.sql.Time [父类]java.sql.Date日期格式为:年月日[只存储日期数据不存储时间数据] [子类]java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒) 针对不同的数据库选用不同的日期类型 ·Oracle的Date类型,只需要年月日,选择使用java.sql.Timestamp类型 ----------

java.util.Date 和Java.sql.Date、java.sql.Time、java.sql.Timestamp的互换

1.sql时间类型转util时间类型 原理:java.sql.Date.java.sql.Time.java.sql.Timestamp三个类都是java.util.Date的子类,故根据多态的设计原理,父类引用指向子类对象,可以直接转换. 即: java.util.Date uDate = new java.sql.Date(0); 或: java.util.Date uDate = new java.sql.Time(0); 或: java.util.Date uDate = new jav

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结

final SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US);//dd/MM/yyyy final Date now = new Date(); System.out.println(now); final String strDate = sdfDate.format(now); System.out.println(strDate); final Timesta

解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题

在项目中使用Apache开源的Services Framework CXF来发布WebService,CXF能够很简洁与Spring Framework 集成在一起,在发布WebService的过程中,发布的接口的入参有些类型支持不是很好,比如Timestamp和Map.这个时候我们就需要编写一些适配来实行类型转换. TimestampAdapter.java package com.loongtao.general.crawler.webservice.utils; import java.s

java向oracle数据库中插入当前时间

public class Test{public static void main (String args []){ java.util.Date a = new java.util.Date();System.out.println(a);java.sql.Date b = new java.sql.Date(a.getTime());System.out.println(b);java.sql.Time c = new java.sql.Time(a.getTime());System.o

Java 读取txt文件后把数据保存到数据库中

需求:有一个很大的txt文件(1,000,000条数据),从txt中读取有用数据库后保存到Oracle数据库中 利用Java实现: 1.读取文件 2.数据库连接后插入到数据库 package com.test.IF.service; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedS