`

java.sql.Date,java.sql.Time和java.sql.Timestamp

    博客分类:
  • java
阅读更多

 

java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。他们跟java.util.Date有什么区别, 设计这三个类有什么用意呢?
先看看一个例子:
但是为什么java.sql.Date类型的值插入到数据库中Date字段中会发生数据截取呢?
java.sql.Date是为了配合SQL DATE而设置的数据类型。“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD
当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。
可以看出,java.sql.Date,java.sql.Time和java.sql.Timestamp都是为了更好的规范化java.util.Date, 让它能更好的区分日期,时分秒。

一、java.util.Date向java.sql.Date的规范化
如果数据库中存在的非规范化部分的信息将会被劫取。在sun提供的ResultSet.java中这样对getDate进行注释的:
Retrieves the value 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丢失了日期部分.
http://www.thunderguy.com/semicolon/2003/08/14/java-sql-date-is-not-a-real-date/ 文章中提到,要保存java.util.Date的精确值,
 我们需要利用java.sql.Timestamp.

java.sql.Date stores only date information, not times. Simply converting a java.util.Date into a java.sql.Date will silently set the time to midnight. So, to store date/times to be manipulated as java.util.Date objects, don’t do this:
// BUG: loses time of day
preparedStatement.setDate(1, new java.sql.Date(date.getTime()));
do this instead:
preparedStatement.setTimestamp(1, new java.sql.Timestamp(date.getTime()));
java.sql.Timestamp is not a date

                *                        *                        *

二、java.sql.Timestamp到java.util.Date的转化
java.sql.Timestamp extends java.util.Date , but it should not be used as a Date . In JDK 1.3.1, Timestamp.getTime() (inherited from Date ) returns the time to the nearest second only, but JDK 1.4.2 and JDK 1.5 it returns the time to the nearest millisecond as expected. So in JDK 1.3, when reading a timestamp from a ResultSet , don’t do this:
// Java 1.3
java.util.Date d = resultSet.getTimestamp(1);
long millis = d.getTime(); // BUG: loses fractional seconds in JDK 1.3
To get the full date including milliseconds, you have to do this:
java.sql.Timestamp timestamp = resultSet.getTimestamp(1);
java.util.Date d = new java.util.Date(timestamp.getTime() +
                                      timestamp.getNanos() / 1000000);
//nanos是纳秒,1纳秒=百万分之一毫秒
In JDK 1.4.2 and JDK 1.5, you can just do this, depending on what you’re going to do with the Date:
// Java 1.4+
java.util.Date d = resultSet.getTimestamp(1);
But this might be safer since it avoids any other potential Timestamp problems:
// Java 1.4+
java.util.Date d = new java.util.Date(resultSet.getTimestamp(1).getTime());
If your code needs to run on JDK 1.3 and later, you’ll have to do this:
java.sql.Timestamp timestamp = resultSet.getTimestamp(1);
long millis = (timestamp.getTime() / 1000) * 1000 + timestamp.getNanos() / 1000000;
java.util.Date d = new java.util.Date(millis);

<!-- E 文章--><!-- S 标签&复制链接-->
分享到:
评论
1 楼 greathjt 2010-01-20  
很有用的信息,谢谢总结

相关推荐

    Java.util.date与java.sql.date区别和转换

    类型转换 ( Java.util.date与java.sql.date区别和转换

    项目源码-java图书馆管理系统

    import java.sql.Date; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import ...

    java四种时间的区别和联系

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

    xfire测试项目(包括复杂数据类型)

    public java.sql.Timestamp getTimestamp(java.sql.Timestamp a); public java.sql.Date getSDate(java.sql.Date a); public java.sql.Time getTime(java.sql.Time a); /*自定义类型*/ public UserBean getUser...

    DateUtil.java

    将java.sql.Date类型格式化成字符串显示; 将Timestamp类型格式化成字符串显示 将字符串转换成java.util.Date类型 将字符串转换成java.sql.Date类型 将字符串转换成Timestamp类型 比较两个时间的时间差,返回格式为x天...

    Java对象序列化和反序列化工具Xson.zip

    24.java.sql.Timestamp 25.InetAddress 26.Inet4Address 27.Inet6Address 28.InetSocketAddress 1.使用xson进行对象到字节数组的序列化 User user = new User(); //set.... byte[] data = XSON.write...

    mysql时间类型对应的java类型1

    Mysql 与 java 的时间类型 MySql的时间类型有 Java中与之对应的时间类型 datejava.sql.Date Datetimejava.sql

    mysql 日期函数.txt

    1. 2.DAYOFWEEK(date) 3.WEEKDAY(date) 4.DAYOFMONTH(date) ...UNIX_TIMESTAMP(date) 26.FROM_UNIXTIME(unix_timestamp) FROM_UNIXTIME(unix_timestamp,format) 27.SEC_TO_TIME(seconds) 28.TIME_TO_SEC(time)

    Date4long2String

    日期转换,long类型时间转换成string类型

    sql访问数据库工具类--SqlUtils(java源码)

    || object.getClass().equals(Timestamp.class)) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return "to_date('" + sdf.format(object) + "','yyyy-mm-dd hh24:mi:ss')...

    java到MySQL的日期操作

    将java中的Date类型存放进MySql数据库需要用到java.sql.Timestamp包,

    解析MySql与Java的时间类型

    MySql的时间类型有 Java中与之对应的时间类型date java.sql.DateDatetime java.sql.TimestampTimestamp java.sql.TimestampTime java.sql.TimeYear 

    spring AOP

    import java.sql.Timestamp; import java.util.Date; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io...

    java源代码公司管理系统

    import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import com.wsy.model.Back; import com.wsy.model.BookInfo; import com.wsy.model.BookType; import com.wsy.model.Borrow; ...

    java时间处理工具类--DateUtils

    * @(#)DateUtil.java * * * @author kidd * @version 1.00 2007/8/8 */ import java.util.*; import java.text.*; import java.sql.Timestamp; public class DateUtils { /** * 时间范围:年 */ ...

    DtSQL通用数据库管理工具

    DtSQL是一款通用的数据库查询,编辑,浏览和管理工具.它能支持目前市面上见到几乎所有的数据库,并能在主要的操作系统上运行. ...并可以选择integer, date, time, timestamp, and boolean的模板来格式化数据

    Oracle date 和 timestamp 区别详解

    Oracle date 和 timestamp 区别详解 1.DATE数据类型  这个数据类型我们实在是太熟悉了,当我们需要表示日期和时间的话都会想到date类型。它可以存储月,年,日,世纪,时,分和秒。它典型地用来表示什么时候事情...

    Oracle jdbc for 11g 最新版 驱动 ojdbc6.jar

     包括ARRAY, BFILE, DATE, INTERVALDS, NUMBER, STRUCT, TIME,TIMESTAMP,TIMESTAMP等。  ojdbc5.jar: 适用于jdk5  ojdbc6.jar: 适用于jdk6  ***_g.jar 只是用javac -g编译,生成所有调试信息,其它全一样  ...

    Hibernate注释大全收藏

    @TemporalType.(DATE,TIME,TIMESTAMP) 分别Map java.sql.(Date, Time, Timestamp). @Lob 注解属性将被持久化为 Blog 或 Clob 类型。具体的java.sql.Clob, Character[], char[] 和 java.lang.String 将被持久化为 ...

    Oracle jdbc for 11g 最新版 驱动 ojdbc6dms.jar

     包括ARRAY, BFILE, DATE, INTERVALDS, NUMBER, STRUCT, TIME,TIMESTAMP,TIMESTAMP等。  ojdbc5.jar: 适用于jdk5  ojdbc6.jar: 适用于jdk6  ***_g.jar 只是用javac -g编译,生成所有调试信息,其它全一样 ...

Global site tag (gtag.js) - Google Analytics