在Web開發(fā)中,避免不了對(duì)日期的操作,常用的關(guān)于時(shí)間的類有這么幾個(gè): java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp,這幾個(gè)類在JDK的定義如下所示: java.lang.Object ....|__java.util.Date ..........|__java.sql.Date/java.sql.Timestamp/java.sql.Time ....|__java.security.Timestamp java.util.Date日期格式為:年月日時(shí)分秒 java.sql.Date日期格式為:年月日[只存儲(chǔ)日期數(shù)據(jù)不存儲(chǔ)時(shí)間數(shù)據(jù),是專門針對(duì)sql設(shè)計(jì)] java.sql.Time日期格式為:時(shí)分秒 java.sql.Timestamp日期格式為:年月日時(shí)分秒納秒(毫微秒)
這些類的關(guān)系如下所示: java.util.Date這個(gè)類是java.sql.Date, java.sql.Time, java.slq.Timestamp這三個(gè)類的父類。這三個(gè)類對(duì)java.util.Date類進(jìn)行了包裝。
java.sql.Date類屏蔽了java.util.Date類的時(shí)間有關(guān)的方法(形如:hh:mm:ss),因此,不可以通過這個(gè)類訪問時(shí)間有關(guān)的信息,比如,如果你通過sqlDate.getHour()方法去訪問小時(shí)信息,此方法會(huì)拋出一個(gè)IllegalArgumentException異常。這是因?yàn)閖ava.sql.Date在繼承java.util.Date類的時(shí)候?qū)Ω割愡M(jìn)行了重寫,禁用了時(shí)間訪問的方法。之所以這么處理,是為了和數(shù)據(jù)庫的Date數(shù)據(jù)類型相匹配,數(shù)據(jù)庫的Date數(shù)據(jù)類只是保存日期有關(guān)的字段。但是它java.sql.Date類有g(shù)etTime方法返回毫秒數(shù),所以它可以與java.util.Date進(jìn)行互換:
java.sql.Date轉(zhuǎn)為java.util.Date java.sql.Date sqlDate=new java.sql.Date(); java.util.Date utilDate=new java.util.Date (sqlDate.getTime()); java.util.Date轉(zhuǎn)為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的日期有關(guān)的字段(形如:yyyy-MM-dd),因此,不能通過這個(gè)類訪問日期有關(guān)的信息,比如:如果你通過sqlTime.getYear()方法去獲取年有關(guān)的信息,此方法會(huì)拋出一個(gè)IllegalArgumentException異常。這是因?yàn)閖ava.sql.Time在繼承java.util.Date類的時(shí)候?qū)Ω割愡M(jìn)行了重寫,禁用了日期訪問的方法。之所以這么處理,是為了和數(shù)據(jù)庫的Time數(shù)據(jù)類型相匹配,數(shù)據(jù)庫的Time數(shù)據(jù)類行只是保存時(shí)間有關(guān)的字段。
java.sql.date 是只包含了日期。而 java.sql.time 只包含了一個(gè)時(shí)間。java.sql.time java.sql.date 二者如何組合成一個(gè)java.util.date呢?取毫秒相加,作為java.util.date的構(gòu)造方法參數(shù)就可以了。
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字段則對(duì)java.util.Date這個(gè)類進(jìn)行了擴(kuò)充,它在java.util.Date類的基礎(chǔ)上增加了毫秒的時(shí)間訪問控制,因此,你可以通過getNanos方法去獲取時(shí)間的毫微秒數(shù)(注意此處獲取的時(shí)間是以毫微秒為單位的,1秒等于十億毫微秒),同樣的,這也是為了和數(shù)據(jù)庫中的Timestamp數(shù)據(jù)類型進(jìn)行匹配。
理清了上述四個(gè)類的關(guān)系,那么java.util.Date和java.util.Calendar類有什么關(guān)系呢?java.util.Calendar類是java.util.Date類的一個(gè)更加深入,更加全面的替代。Java.util.Calendar類支持java.util.Date的所有功能,此外,Calendar還引入了多語言,多區(qū)域的特性,可以根據(jù)需要獲取不同區(qū)域,不同時(shí)區(qū)的時(shí)間,Calendar還增加了比Date更加方便和快捷的許多操作,如獲取一年當(dāng)中的第幾個(gè)星期,各個(gè)月的天數(shù)等便捷的方法。
Java.util.Calendar區(qū)別與java.util.Date的幾個(gè)地方也需要注意一下:首先,Calendar增加了毫秒的時(shí)間段,通過它可以獲取時(shí)間點(diǎn)的毫秒值,而java.util.Date只是精確到秒。其次,Calendar獲取年的時(shí)候是當(dāng)前年份比如:2010,而Date獲取年份的時(shí)獲取到的是當(dāng)前年份-1900的一個(gè)值(2010-1900=110,因此,你調(diào)用getYear后過去的值就是110)。最后Calendar是一個(gè)抽象類,之所以能夠?qū)嵗且驗(yàn)榇颂幍腃alendar充當(dāng)了一個(gè)類似于工廠的作用,在getInstance方法中實(shí)例化了Calendar子類GregorianCalendar,并把它返回給用戶使用。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注