java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp區別和聯絡,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.Date日期格式為:年月日時分秒
java.sql.Date日期格式為:年月日[只儲存日期資料不儲存時間資料,是專門針對sql設計]
java.sql.Time日期格式為:時分秒
java.sql.Timestamp日期格式為:年月日時分秒納秒(毫微秒)
這些類的關係如下所示:
java.util.Date這個類是java.sql.Date, java.sql.Time, java.sql.Timestamp這三個類的父類。這三個類對java.util.Date類進行了封裝。
java.sql.Date類屏蔽了java.util.Date類的時間有關的方法(形如:hh:mm:ss),因此,不可以通過這個類訪問時間有關的資訊,比如,如果你通過sqlDate.getHour()方法去訪問小時資訊,此方法會拋出一個IllegalArgumentException異常。這是因為java.sql.Date在繼承java.util.Date類的時候對父類進行了重寫,禁用了時間訪問的方法。之所以這麼處理,是為了和資料庫的Date資料類型相匹配,資料庫的Date資料類只是儲存日期有關的欄位。但是它java.sql.Date類有getTime方法返回毫秒數,所以它可以與java.util.Date進行互換:
java.sql.Date轉為java.util.Date
java.sql.Date sqlDate=new java.sql.Date();
java.util.Date utilDate=new java.util.Date (sqlDate.getTime());
java.util.Date轉為java.sql.Date
java.util.Date utilDate=new Date();
java.sql.Date sqlDate=new java.sql.Date(utilDate.getTime());
java.sql.Time類屏蔽了java.util.Date的日期有關的欄位(形如:yyyy-MM-dd),因此,不能通過這個類訪問日期有關的資訊,比如:如果你通過sqlTime.getYear()方法去擷取年有關的資訊,此方法會拋出一個IllegalArgumentException異常。這是因為java.sql.Time在繼承java.util.Date類的時候對父類進行了重寫,禁用了日期訪問的方法。之所以這麼處理,是為了和資料庫的Time資料類型相匹配,資料庫的Time資料類行只是儲存時間有關的欄位。
java.sql.date 是只包含了日期。而 java.sql.time 只包含了一個時間。java.sql.time java.sql.date 二者如何組合成一個java.util.date呢?取毫秒相加,作為java.util.date的構造方法參數就可以了。
java.sql.Date d = new java.sql.Date(new java.util.Date().getTime());
java.sql.Time t = new java.sql.Time(new java.util.Date().getTime());
java.util.Date day = new java.util.Date(d.getTime() + t.getTime());
java.sql.Timestamp欄位則對java.util.Date這個類進行了擴充,它在java.util.Date類的基礎上增加了毫秒的時間存取控制,因此,你可以通過getNanos方法去擷取時間的毫微秒數(注意此處擷取的時間是以毫微秒為單位的,1秒等於十億毫微秒),同樣的,這也是為了和資料庫中的Timestamp資料類型進行匹配。
理清了上述四個類的關係,那麼java.util.Date和java.util.Calendar類有什麼關係呢?
java.util.Calendar類是java.util.Date類的一個更加深入,更加全面的替代。Java.util.Calendar類支援java.util.Date的所有功能,此外,Calendar還引入了多語言,多地區的特性,可以根據需要擷取不同地區,不同時區的時間,Calendar還增加了比Date更加方便和快捷的許多操作,如擷取一年當中的第幾個星期,各個月的天數等便捷的方法。
Java.util.Calendar區別與java.util.Date的幾個地方也需要注意一下:首先,Calendar增加了毫秒的時間段,通過它可以擷取時間點的毫秒值,而java.util.Date只是精確到秒。其次,Calendar擷取年的時候是當前年份比如:2010,而Date擷取年份的時擷取到的是當前年份-1900的一個值(2010-1900=110,因此,你調用getYear後過去的值就是110)。最後Calendar是一個抽象類別,之所以能夠執行個體化,是因為此處的Calendar充當了一個類似於工廠的作用,在getInstance方法中執行個體化了Calendar子類GregorianCalendar,並把它返回給使用者使用。
Java中之間轉換
package demo;import java.sql.Timestamp;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class TestData { public static void main(String[] args) throws ParseException { Date d = new Date(new Date().getTime()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String nowday1 = "2015-5-12 10:30:12"; String nowday2 = "2015-05-12 10:30:12"; Timestamp tt = new Timestamp(System.currentTimeMillis()); System.out.println(sdf.format(d));//Date -> String System.out.println(sdf.parse(nowday1)); // String -> Date System.out.println(sdf.format(tt)); // Timestamp -> String System.out.println(tt.valueOf(nowday2));//String -> Timestamp :String的類型必須形如: yyyy-mm-dd hh:mm:ss[.f...] 這樣的格式,中括弧表示可選,否則報錯 System.out.println(d=tt); // Timestamp -> Date 因為是父類直接向上轉型 System.out.println(new Timestamp(d.getTime())); // Date ->Timestamp }}/* * oracle中Date與Timestamp轉換 * SELECT TO_TIMESTAMP(TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') FROM dual; * SELECT TO_DATE(TO_CHAR(TO_TIMESTAMP(TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') FROM dual; * * *//**2015-05-12 10:44:15Tue May 12 10:30:12 CST 20152015-05-12 10:44:152015-05-12 10:30:12.02015-05-12 10:44:15.1082015-05-12 10:44:15.108**/