(1)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, 讓它能更好的區分日期,時分秒。
1、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
* * *
2、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);
(2)
java.util.Date,java.sql.Date和java.sql.Timestampsql
1.java.sql.Date用於直接跟數據庫中Date類型的字段聯繫;java.util.Date是用於程序中的特殊類,能夠跟系統時間格式相通數據庫
java.sql.Date sd;
java.util.Date ud;ide
ud = new java.util.Date();函數
sd = new java.sql.Date(ud.getTime());sqlserver
若是要插入到數據庫而且相應的字段爲Date類型
那麼能夠用PreparedStatement.setDate(int ,java.sql.Date)方法
其中的java.sql.Date能夠用上面的方法獲得,即PreparedStatement.setDate(int ,sd);
this
固然,也能夠用數據庫提供的TO_DATE函數
好比 現有 ud
TO_DATE(new SimpleDateFormat().format(ud,"yyyy-MM-dd HH:mm:ss"),
"YYYY-MM-DD HH24:MI:SS")spa
2.java.sql.Timestamp 也是用於直接跟數據庫中Date類型的字段聯繫,只不過要看具體數據庫來進行選擇用哪一個.對於像Oracle中的Date只有年月日的,就用 java.util.Date;而對於像sqlserver中DateTime有年月日時分秒的,就用java.sql.Timestamp.設計
(3) java.util.Date包含時間和數據,而java.sql.Date只包含時間,java.sql.Timestamp包含時間和數據。java.sql.Timestamp.,和java.sql.date都是繼承於java.util.Date。rest