util.Date、sql.Date、sql.Time、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.slq.Timestamp這三個類的父類。這三個類對java.util.Date類進行了包裝。java

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());sql

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數據類型進行匹配。spa

理清了上述四個類的關係,那麼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,並把它返回給用戶使用。設計

附上例子:code

java.util.Date是在除了SQL語句的狀況下面使用的。
java.sql.Date是針對SQL語句使用的,它只包含日期而沒有時間部分
它們都有getTime方法返回毫秒數,天然就能夠直接構建。 java.util.Date 是 java.sql.Date 的父類,前者是經常使用的表示時間的類,咱們一般格式化或者獲得當前時間都是用他,後者以後在讀寫數據庫的時候用他,由於PreparedStament的setDate()的第2參數和ResultSet的getDate()方法的第2個參數都是java.sql.Date。orm

 java.sql.Date轉爲java.util.Date
繼承

java.sql.Date date=new java.sql.Date();
java.util.Date d=new java.util.Date (date.getTime());

 java.util.Date轉爲java.sql.Date
ci

java.util.Date utilDate=new Date();
java.sql.Date sqlDate=new java.sql.Date(utilDate.getTime());
 java.util.Date utilDate=new Date();
java.sql.Date sqlDate=new java.sql.Date(utilDate.getTime());
java.sql.Time sTime=new java.sql.Time(utilDate.getTime());
java.sql.Timestamp stp=new java.sql.Timestamp(utilDate.getTime());

這裏全部時間日期均可以被SimpleDateFormat格式化format()
開發

SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
f.format(stp);
f.format(sTime);
f.format(sqlDate);
f.format(utilDate)
java.sql.Date sqlDate=java.sql.Date.valueOf(" 2005-12-12");
utilDate=new java.util.Date(sqlDate.getTime());

 另類取得年月日的方法:

import java.text.SimpleDateFormat;
import java.util.*;
java.util.Date date = new java.util.Date();
//若是但願獲得YYYYMMDD的格式SimpleDateFormat
sy1=new SimpleDateFormat("yyyyMMDD");
String dateFormat=sy1.format(date);
//若是但願分開獲得年,月,日SimpleDateFormat
sy=new SimpleDateFormat("yyyy");
SimpleDateFormat sm=new SimpleDateFormat("MM");
SimpleDateFormat sd=new SimpleDateFormat("dd");
String syear=sy.format(date);
String smon=sm.format(date);
String sday=sd.format(date)
相關文章
相關標籤/搜索