- 浏览: 11971 次
- 性别:
- 来自: 苏州
最新评论
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);
本节参考自:http://www.thunderguy.com/semicolon/2003/08/14/java-sql-date-is-not-a-real-date/ [size=xx-small][/size][size=large][/size]
先看看一个例子:
但是为什么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);
本节参考自:http://www.thunderguy.com/semicolon/2003/08/14/java-sql-date-is-not-a-real-date/ [size=xx-small][/size][size=large][/size]
发表评论
-
Java 理论与实践: 处理 InterruptedException
2011-05-03 11:28 1617在学校的论坛Java版发现很多问关于这样的问题,比如这几个方法 ... -
Java程序员的推荐阅读书籍
2011-05-03 11:09 617[/size] 作为Java程序员来说,最痛苦的事情莫过于可以 ... -
文件锁
2011-04-27 15:57 1077文件锁 JDK 1.4引入了文件加锁机制,允许我们同步访问一 ... -
ConcurrentHashMap
2011-04-26 15:18 927ConcurrentHashMap 是 Doug Lea ... -
java ClassLoader
2011-04-25 19:49 806[/size]Java Class Loader 文章分类:J ... -
Oracle语句优化53个规则详解
2011-04-18 15:03 867[/size]Oracle语句优化53个 ... -
JVM参数
2011-04-18 14:41 785[/size]基本回收算法 ... -
javaStax
2011-04-18 14:27 1137[/size]野马(Mustang,Java 6.0代号)相比 ... -
log4J
2011-04-18 13:39 754log4j.rootLogger=INFO, A1 log4j ... -
Java堆栈
2011-04-18 13:25 1626jvm为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存 ... -
Eclipse 快捷键
2011-04-18 10:00 554Eclipse 快捷键(1) Ctrl+1 快速修复(最经典的 ... -
Java内存管理
2011-04-18 09:38 524关于Java内存分配,很多 ...
相关推荐
类型转换 ( Java.util.date与java.sql.date区别和转换
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.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp区别和联系
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...
将java.sql.Date类型格式化成字符串显示; 将Timestamp类型格式化成字符串显示 将字符串转换成java.util.Date类型 将字符串转换成java.sql.Date类型 将字符串转换成Timestamp类型 比较两个时间的时间差,返回格式为x天...
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 的时间类型 MySql的时间类型有 Java中与之对应的时间类型 datejava.sql.Date Datetimejava.sql
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)
日期转换,long类型时间转换成string类型
|| 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中的Date类型存放进MySql数据库需要用到java.sql.Timestamp包,
MySql的时间类型有 Java中与之对应的时间类型date java.sql.DateDatetime java.sql.TimestampTimestamp java.sql.TimestampTime java.sql.TimeYear
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...
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; ...
* @(#)DateUtil.java * * * @author kidd * @version 1.00 2007/8/8 */ import java.util.*; import java.text.*; import java.sql.Timestamp; public class DateUtils { /** * 时间范围:年 */ ...
DtSQL是一款通用的数据库查询,编辑,浏览和管理工具.它能支持目前市面上见到几乎所有的数据库,并能在主要的操作系统上运行. ...并可以选择integer, date, time, timestamp, and boolean的模板来格式化数据
Oracle date 和 timestamp 区别详解 1.DATE数据类型 这个数据类型我们实在是太熟悉了,当我们需要表示日期和时间的话都会想到date类型。它可以存储月,年,日,世纪,时,分和秒。它典型地用来表示什么时候事情...
包括ARRAY, BFILE, DATE, INTERVALDS, NUMBER, STRUCT, TIME,TIMESTAMP,TIMESTAMP等。 ojdbc5.jar: 适用于jdk5 ojdbc6.jar: 适用于jdk6 ***_g.jar 只是用javac -g编译,生成所有调试信息,其它全一样 ...
@TemporalType.(DATE,TIME,TIMESTAMP) 分别Map java.sql.(Date, Time, Timestamp). @Lob 注解属性将被持久化为 Blog 或 Clob 类型。具体的java.sql.Clob, Character[], char[] 和 java.lang.String 将被持久化为 ...
包括ARRAY, BFILE, DATE, INTERVALDS, NUMBER, STRUCT, TIME,TIMESTAMP,TIMESTAMP等。 ojdbc5.jar: 适用于jdk5 ojdbc6.jar: 适用于jdk6 ***_g.jar 只是用javac -g编译,生成所有调试信息,其它全一样 ...