Java 時間日期詳細引見及實例。本站提示廣大學習愛好者:(Java 時間日期詳細引見及實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 時間日期詳細引見及實例正文
Java 時間日期
概要:
順序就是輸出——>處置——>輸入。對數據的處置是順序員需求著重留意的中央,疾速、高效的對數據停止處置時我們的追求。其中,時間日期的處置又尤為重要戰爭凡,此次,我將把Java中的時間日期處置方式停止復雜的解析,為自己當前的學習做一個備忘,也為初學者做一個自創。
時間,英文Time;日期,英文Date;日歷,英文Calendar。Java中注重語義化,也是用以上的稱號對時間日期函數和相關類停止命名。
我們將以Java自帶的時間日期類和其中的處置函數停止剖析。
一、與時間日期有關的類。
java.util.Date。完成類,其對象具有時間、日期組件。
java.util.Calendar。籠統類,其對象具有時間、日期組件。
java.sql.Date。完成類,其對象具有日期組件。
java.sql.Time。完成類,其對象具有時間組件。
java.sql.Timestamp。完成類,其對象具有時間日期組件。
java.text.DateFormat。籠統類,其對象格式化時間日期。
java.text.DateFormatSymbols。完成類,其對象為格式化時間日期提供參數。
(sun.util.*canlender*.*。System。Local。TimeZone等)
由於jdk的裝置並沒有給出全部源碼,引薦大家獲取jdk全部源碼:jdk6u23-src.rar jdk7u4-src.rar。
二、類之間的關系。
我們經過圖解和局部jdk源代碼來闡明。
(上圖有幾處錯誤,Calendar拼寫錯誤。)
以上的圖列出了局部常用的類。我們普通會運用的類java.util.Date、java.util.Calendar、java.sql.Timestamp、java.text.DateFormat停止時間日期操作,由於他們有完全的時間日期組件和片面的格式化功用。
值得留意的是:java.sql.Date沒有時間組件!而java.sql.Time沒有日期組件!再次提示。什麼意思呢?大家請看上面的代碼:
public static void main(String[] args) { /* * 以下代碼用於向大家展現各個時間日期類對象的包括組件。 */ java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis()); System.out.println(sqlDate.toString()); // 輸入後果:2012-09-01 java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis()); System.out.println(sqlTime.toString()); // 輸入後果:12:35:11 java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis()); System.out.println(sqlTimestamp.toString()); // 輸入後果:2012-09-01 12:36:33.544 java.util.Date utilDate = new java.util.Date(System.currentTimeMillis()); System.out.println(utilDate.toString()); // 輸入後果:Sat Sep 01 12:37:34 CST 2012 java.util.Calendar cl = java.util.Calendar.getInstance(); System.out.println(cl.getTime().toString()); // 輸入後果:Sat Sep 01 12:39:51 CST 2012 }
可以看到:java.util.Date、java.util.Calendar、java.sql.Timestamp具有的時間日期組件(而且他們具有無參結構辦法),java.sql.Date和java.sql.Time只要時間或日期組件。
為了證明以上言論,我將局部jdk源碼貼出來供大家參考。
java.sql.Date源代碼:
package java.sql; public class Date extends java.util.Date { // 省略局部代碼…… // Override all the time operations inherited from java.util.Date; /** * This method is deprecated and should not be used because SQL Date * values do not have a time component. * * @deprecated * @exception java.lang.IllegalArgumentException if this method is invoked * @see #setHours */ public int getHours() { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL Date * values do not have a time component. * * @deprecated * @exception java.lang.IllegalArgumentException if this method is invoked * @see #setMinutes */ public int getMinutes() { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL Date * values do not have a time component. * * @deprecated * @exception java.lang.IllegalArgumentException if this method is invoked * @see #setSeconds */ public int getSeconds() { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL Date * values do not have a time component. * * @deprecated * @exception java.lang.IllegalArgumentException if this method is invoked * @see #getHours */ public void setHours(int i) { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL Date * values do not have a time component. * * @deprecated * @exception java.lang.IllegalArgumentException if this method is invoked * @see #getMinutes */ public void setMinutes(int i) { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL Date * values do not have a time component. * * @deprecated * @exception java.lang.IllegalArgumentException if this method is invoked * @see #getSeconds */ public void setSeconds(int i) { throw new java.lang.IllegalArgumentException(); } /** * Private serial version unique ID to ensure serialization * compatibility. */ static final long serialVersionUID = 1511598038487230103L; }
java.sql.Time源代碼:
// 省略局部源代碼…… /** * This method is deprecated and should not be used because SQL <code>TIME</code> * values do not have a year component. * * @deprecated * @exception java.lang.IllegalArgumentException if this * method is invoked * @see #setYear */ @Deprecated public int getYear() { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL <code>TIME</code> * values do not have a month component. * * @deprecated * @exception java.lang.IllegalArgumentException if this * method is invoked * @see #setMonth */ @Deprecated public int getMonth() { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL <code>TIME</code> * values do not have a day component. * * @deprecated * @exception java.lang.IllegalArgumentException if this * method is invoked */ @Deprecated public int getDay() { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL <code>TIME</code> * values do not have a date component. * * @deprecated * @exception java.lang.IllegalArgumentException if this * method is invoked * @see #setDate */ @Deprecated public int getDate() { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL <code>TIME</code> * values do not have a year component. * * @deprecated * @exception java.lang.IllegalArgumentException if this * method is invoked * @see #getYear */ @Deprecated public void setYear(int i) { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL <code>TIME</code> * values do not have a month component. * * @deprecated * @exception java.lang.IllegalArgumentException if this * method is invoked * @see #getMonth */ @Deprecated public void setMonth(int i) { throw new java.lang.IllegalArgumentException(); } /** * This method is deprecated and should not be used because SQL <code>TIME</code> * values do not have a date component. * * @deprecated * @exception java.lang.IllegalArgumentException if this * method is invoked * @see #getDate */ @Deprecated public void setDate(int i) { throw new java.lang.IllegalArgumentException(); } /** * Private serial version unique ID to ensure serialization * compatibility. */ static final long serialVersionUID = 8397324403548013681L; }
從下面的代碼可以看出:java.sql.Date和java.sql.Time的確是不具有完好組件的!
我們再次應用代碼來闡明:
public static void main(String[] args) { /* * 以下代碼用於向大家展現各個時間日期類對象的包括組件。 */ java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis()); System.out.println(sqlDate.toString()); // 輸入後果:2012-09-01 java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis()); System.out.println(sqlTime.toString()); // 輸入後果:12:35:11 java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis()); System.out.println(sqlTimestamp.toString()); // 輸入後果:2012-09-01 12:36:33.544 java.util.Date utilDate = new java.util.Date(System.currentTimeMillis()); System.out.println(utilDate.toString()); // 輸入後果:Sat Sep 01 12:37:34 CST 2012 java.util.Calendar cl = java.util.Calendar.getInstance(); System.out.println(cl.getTime().toString()); // 輸入後果:Sat Sep 01 12:39:51 CST 2012 /* * 以下代碼用於實驗java.sql.Date和java.sql.Time能否具有完好組件。 */ System.out.println(); try { System.out.println(sqlDate.getHours()); } catch (Exception e) { System.out.println(e.getMessage()); // 輸入 null } try { System.out.println(sqlTime.getDate()); } catch (Exception e) { System.out.println(e.getMessage()); // 輸入 null } }
實驗成功,一切給大家一個忠告:在停止數據庫時間日期操作時,運用java.sql.Timestamp類。
那麼很復雜,假如您需求在順序中停止完好的時間日期操作,引薦您運用java.util.Date+java.text.DateFormat。
假如您需求停止復雜或深化的操作,您可以選擇java.util.Calendar。有人說Calendar是Date的復雜版本,我覺得說得有一些道理。我們可以經過他們的依賴對象(經過源碼文件中引入的內部類)來證明這個說法:
java.util.Date:
package java.util; import java.text.DateFormat; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.lang.ref.SoftReference; import sun.util.calendar.BaseCalendar; import sun.util.calendar.CalendarDate; import sun.util.calendar.CalendarSystem; import sun.util.calendar.CalendarUtils; import sun.util.calendar.Era; import sun.util.calendar.Gregorian; import sun.util.calendar.ZoneInfo;
java.util.Calendar:
package java.util; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OptionalDataException; import java.io.Serializable; import java.security.AccessControlContext; import java.security.AccessController; import java.security.PermissionCollection; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.security.ProtectionDomain; import java.text.DateFormat; import java.text.DateFormatSymbols; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import sun.util.BuddhistCalendar; import sun.util.calendar.ZoneInfo; import sun.util.resources.LocaleData;
java.util.Date更多地用到了sun.util.*calendar*.*。而java.util.Calendar對他們的依賴則很少,並且Calendar中參加了更好的格式化功用等……(sun.util等源碼裝置jdk不會提供,我在頂部的下載銜接中提供了)。
其實說這麼多都是廢話。對大家有用的東西無非只要兩點:一是怎樣取得時間日期,二是怎樣依照自定義格式顯示。
如今我才來解說以上兩點:
大家可以經過java.util.Date date = new java.util.Date()或許java.util.Date date = java.util.Calendar.getInstance().getTime()取得java.util.Date對象。至多我引薦這樣做,和數據庫打交道的話就用java.sql.Timestamp。
(而實踐上jdk是不引薦我們運用java.util.Date對象來停止時間日期獲取的,我們從java.util.Date類辦法正文可以看到,根本一切的辦法都有@Deprecated注解,而辦法正文粗心則是"從JDK1.1開端,我們引薦您運用Calendar的靜態成員和對象成員來對時間日期停止操作"。我覺得其中的思索能夠無為了防止歧義吧,畢竟Date的意思是日期)
大家可以經過java.text.DateFormat或許他的直接完成類java.text.SimpleDateFormat來完成時間日期的格式化。
上面的代碼會給大家展現如何格式化時間日期:
public static void main(String[] args) { /* * 以下代碼用於向大家展現各個時間日期類對象的包括組件。 */ java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis()); System.out.println(sqlDate.toString()); // 輸入後果:2012-09-01 java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis()); System.out.println(sqlTime.toString()); // 輸入後果:12:35:11 java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis()); System.out.println(sqlTimestamp.toString()); // 輸入後果:2012-09-01 12:36:33.544 java.util.Date utilDate = new java.util.Date(System.currentTimeMillis()); System.out.println(utilDate.toString()); // 輸入後果:Sat Sep 01 12:37:34 CST 2012 java.util.Calendar cl = java.util.Calendar.getInstance(); System.out.println(cl.getTime().toString()); // 輸入後果:Sat Sep 01 12:39:51 CST 2012 /* * 以下代碼用於實驗java.sql.Date和java.sql.Time能否具有完好組件。 */ System.out.println(); try { System.out.println(sqlDate.getHours()); } catch (Exception e) { System.out.println(e.getMessage()); // 輸入 null } try { System.out.println(sqlTime.getDate()); } catch (Exception e) { System.out.println(e.getMessage()); // 輸入 null } /* * 上面的代碼給大家展現時間日期的格式化。 */ System.out.println(); java.text.DateFormat dateFormat = java.text.SimpleDateFormat.getInstance(); // java.util.Date本來的格式 System.out.println(utilDate.toString()); // 輸入:Sat Sep 01 13:16:13 CST 2012 // java.util.Date格式化後的格式 System.out.println(dateFormat.format(sqlDate)); // 輸入:12-9-1 下午1:16 System.out.println(); // 很多時分以上的後果並不是我們希望的,我們希望愈加自在、更見復雜的操作方式 // 此時,java.text.SimpleDateFormat就成了我們的不二選擇 // SimpleDateFormat提供了無參和自定義格式參數的結構辦法使我們可以輕松地完成自定義格式化 java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); System.out.println(simpleDateFormat.format(sqlDate)); // 輸入:2012-09-01 13:20:41 下午 }
(我不是為了占篇幅才貼下去反復代碼的哦^_^)
java.text.SimpleDateFormat的format辦法運用參數提供了弱小的格式化功用(另外,值得一提的是:它的parse辦法也提供了弱小的字符串轉化為Date的功用)。您可以參照以下表格停止選擇:
(上圖有一出錯誤:m和mm中,前者表示當分鐘數小於10會只占用一個輸入位,即輸入0-9而不會輸入00-09)
好了,大家趕忙應用jdk停止時間日期的操作處置吧!
感激閱讀,希望能協助到大家,謝謝大家,對本站的支持!