程序就是輸入——>處理——>輸出。對數據的處理是程序員須要着重注意的地方,快速、高效的對數據進行處理時咱們的追求。其中,時間日期的處理又尤其重要和平凡,這次,我將把Java中的時間日期處理方式進行簡單的解析,爲本身之後的學習作一個備忘,也爲初學者作一個借鑑。java
時間,英文Time;日期,英文Date;日曆,英文Calendar。Java中注重語義化,也是用以上的名稱對時間日期函數和相關類進行命名。程序員
咱們將以Java自帶的時間日期類和其中的處理函數進行分析。sql
1、與時間日期有關的類。數據庫
java.util.Date。實現類,其對象具備時間、日期組件。ide
java.util.Calendar。抽象類,其對象具備時間、日期組件。函數
java.sql.Date。實現類,其對象具備日期組件。學習
java.sql.Time。實現類,其對象具備時間組件。this
java.sql.Timestamp。實現類,其對象具備時間日期組件。.net
java.text.DateFormat。抽象類,其對象格式化時間日期。code
java.text.DateFormatSymbols。實現類,其對象爲格式化時間日期提供參數。
(sun.util.canlender.*。System。Local。TimeZone等)
因爲jdk的安裝並無給出所有源碼,推薦你們獲取jdk所有源碼:jdk6u23-src.rar jdk7u4-src.rar。
2、類之間的關係。
咱們經過圖解和部分jdk源代碼來講明。
(上圖有幾處錯誤,Calendar拼寫錯誤。)
以上的圖列出了部分經常使用的類。咱們通常會使用的類java.util.Date、java.util.Calendar、java.sql.Timestamp、java.text.DateFormat進行時間日期操做,由於他們有徹底的時間日期組件和全面的格式化功能。
值得注意的是:java.sql.Date沒有時間組件!而java.sql.Time沒有日期組件!再次提醒。什麼意思呢?你們請看下面的代碼:
1 public static void main(String[] args) { 2 /* 3 * 如下代碼用於向你們展現各個時間日期類對象的包含組件。 4 */ 5 java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis()); 6 System.out.println(sqlDate.toString()); // 輸出結果:2012-09-01 7 java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis()); 8 System.out.println(sqlTime.toString()); // 輸出結果:12:35:11 9 java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis()); 10 System.out.println(sqlTimestamp.toString()); // 輸出結果:2012-09-01 12:36:33.544 11 java.util.Date utilDate = new java.util.Date(System.currentTimeMillis()); 12 System.out.println(utilDate.toString()); // 輸出結果:Sat Sep 01 12:37:34 CST 2012 13 java.util.Calendar cl = java.util.Calendar.getInstance(); 14 System.out.println(cl.getTime().toString()); // 輸出結果:Sat Sep 01 12:39:51 CST 2012 15 } 能夠看到:java.util.Date、java.util.Calendar、java.sql.Timestamp具備的時間日期組件(並且他們具備無參構造方法),java.sql.Date和java.sql.Time只有時間或日期組件。
爲了證明以上言論,我將部分jdk源碼貼出來供你們參考。
java.sql.Date源代碼:
1 package java.sql; 2 3 4 public class Date extends java.util.Date { 5 6 // 省略部分代碼…… 7 8 // Override all the time operations inherited from java.util.Date; 9 10 /** 11 * This method is deprecated and should not be used because SQL Date 12 * values do not have a time component. 13 * 14 * @deprecated 15 * @exception java.lang.IllegalArgumentException if this method is invoked 16 * @see #setHours 17 / 18 public int getHours() { 19 throw new java.lang.IllegalArgumentException(); 20 } 21 22 /* 23 * This method is deprecated and should not be used because SQL Date 24 * values do not have a time component. 25 * 26 * @deprecated 27 * @exception java.lang.IllegalArgumentException if this method is invoked 28 * @see #setMinutes 29 / 30 public int getMinutes() { 31 throw new java.lang.IllegalArgumentException(); 32 } 33 34 /* 35 * This method is deprecated and should not be used because SQL Date 36 * values do not have a time component. 37 * 38 * @deprecated 39 * @exception java.lang.IllegalArgumentException if this method is invoked 40 * @see #setSeconds 41 / 42 public int getSeconds() { 43 throw new java.lang.IllegalArgumentException(); 44 } 45 46 /* 47 * This method is deprecated and should not be used because SQL Date 48 * values do not have a time component. 49 * 50 * @deprecated 51 * @exception java.lang.IllegalArgumentException if this method is invoked 52 * @see #getHours 53 / 54 public void setHours(int i) { 55 throw new java.lang.IllegalArgumentException(); 56 } 57 58 /* 59 * This method is deprecated and should not be used because SQL Date 60 * values do not have a time component. 61 * 62 * @deprecated 63 * @exception java.lang.IllegalArgumentException if this method is invoked 64 * @see #getMinutes 65 / 66 public void setMinutes(int i) { 67 throw new java.lang.IllegalArgumentException(); 68 } 69 70 /* 71 * This method is deprecated and should not be used because SQL Date 72 * values do not have a time component. 73 * 74 * @deprecated 75 * @exception java.lang.IllegalArgumentException if this method is invoked 76 * @see #getSeconds 77 / 78 public void setSeconds(int i) { 79 throw new java.lang.IllegalArgumentException(); 80 } 81 82 /* 83 * Private serial version unique ID to ensure serialization 84 * compatibility. 85 */ 86 static final long serialVersionUID = 1511598038487230103L; 87 } java.sql.Time源代碼:
1 // 省略部分源代碼…… 2 3 /** 4 * This method is deprecated and should not be used because SQL <code>TIME</code> 5 * values do not have a year component. 6 * 7 * @deprecated 8 * @exception java.lang.IllegalArgumentException if this 9 * method is invoked 10 * @see #setYear 11 / 12 @Deprecated 13 public int getYear() { 14 throw new java.lang.IllegalArgumentException(); 15 } 16 17 /* 18 * This method is deprecated and should not be used because SQL <code>TIME</code> 19 * values do not have a month component. 20 * 21 * @deprecated 22 * @exception java.lang.IllegalArgumentException if this 23 * method is invoked 24 * @see #setMonth 25 / 26 @Deprecated 27 public int getMonth() { 28 throw new java.lang.IllegalArgumentException(); 29 } 30 31 /* 32 * This method is deprecated and should not be used because SQL <code>TIME</code> 33 * values do not have a day component. 34 * 35 * @deprecated 36 * @exception java.lang.IllegalArgumentException if this 37 * method is invoked 38 / 39 @Deprecated 40 public int getDay() { 41 throw new java.lang.IllegalArgumentException(); 42 } 43 44 /* 45 * This method is deprecated and should not be used because SQL <code>TIME</code> 46 * values do not have a date component. 47 * 48 * @deprecated 49 * @exception java.lang.IllegalArgumentException if this 50 * method is invoked 51 * @see #setDate 52 / 53 @Deprecated 54 public int getDate() { 55 throw new java.lang.IllegalArgumentException(); 56 } 57 58 /* 59 * This method is deprecated and should not be used because SQL <code>TIME</code> 60 * values do not have a year component. 61 * 62 * @deprecated 63 * @exception java.lang.IllegalArgumentException if this 64 * method is invoked 65 * @see #getYear 66 / 67 @Deprecated 68 public void setYear(int i) { 69 throw new java.lang.IllegalArgumentException(); 70 } 71 72 /* 73 * This method is deprecated and should not be used because SQL <code>TIME</code> 74 * values do not have a month component. 75 * 76 * @deprecated 77 * @exception java.lang.IllegalArgumentException if this 78 * method is invoked 79 * @see #getMonth 80 / 81 @Deprecated 82 public void setMonth(int i) { 83 throw new java.lang.IllegalArgumentException(); 84 } 85 86 /* 87 * This method is deprecated and should not be used because SQL <code>TIME</code> 88 * values do not have a date component. 89 * 90 * @deprecated 91 * @exception java.lang.IllegalArgumentException if this 92 * method is invoked 93 * @see #getDate 94 / 95 @Deprecated 96 public void setDate(int i) { 97 throw new java.lang.IllegalArgumentException(); 98 } 99 100 /* 101 * Private serial version unique ID to ensure serialization 102 * compatibility. 103 */ 104 static final long serialVersionUID = 8397324403548013681L; 105 } 從上面的代碼能夠看出:java.sql.Date和java.sql.Time確實是不具備完整組件的!
咱們再次利用代碼來講明:
1 public static void main(String[] args) { 2 /* 3 * 如下代碼用於向你們展現各個時間日期類對象的包含組件。 4 / 5 java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis()); 6 System.out.println(sqlDate.toString()); // 輸出結果:2012-09-01 7 java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis()); 8 System.out.println(sqlTime.toString()); // 輸出結果:12:35:11 9 java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis()); 10 System.out.println(sqlTimestamp.toString()); // 輸出結果:2012-09-01 12:36:33.544 11 java.util.Date utilDate = new java.util.Date(System.currentTimeMillis()); 12 System.out.println(utilDate.toString()); // 輸出結果:Sat Sep 01 12:37:34 CST 2012 13 java.util.Calendar cl = java.util.Calendar.getInstance(); 14 System.out.println(cl.getTime().toString()); // 輸出結果:Sat Sep 01 12:39:51 CST 2012 15
16 / 17 * 如下代碼用於試驗java.sql.Date和java.sql.Time是否具備完整組件。 18 */ 19 System.out.println(); 20 try { 21 System.out.println(sqlDate.getHours()); 22 } catch (Exception e) { 23 System.out.println(e.getMessage()); // 輸出 null 24 } 25 try { 26 System.out.println(sqlTime.getDate()); 27 } catch (Exception e) { 28 System.out.println(e.getMessage()); // 輸出 null 29 } 30 } 實驗成功,全部給你們一個忠告:在進行數據庫時間日期操做時,使用java.sql.Timestamp類。
那麼很簡單,若是您須要在程序中進行完整的時間日期操做,推薦您使用java.util.Date+java.text.DateFormat。
若是您須要進行復雜或深刻的操做,您能夠選擇java.util.Calendar。有人說Calendar是Date的複雜版本,我以爲說得有一些道理。咱們能夠經過他們的依賴對象(經過源碼文件中引入的外部類)來證明這個說法:
java.util.Date:
1 package java.util; 2 3 import java.text.DateFormat; 4 import java.io.IOException; 5 import java.io.ObjectOutputStream; 6 import java.io.ObjectInputStream; 7 import java.lang.ref.SoftReference; 8 import sun.util.calendar.BaseCalendar; 9 import sun.util.calendar.CalendarDate; 10 import sun.util.calendar.CalendarSystem; 11 import sun.util.calendar.CalendarUtils; 12 import sun.util.calendar.Era; 13 import sun.util.calendar.Gregorian; 14 import sun.util.calendar.ZoneInfo; java.util.Calendar:
1 package java.util; 2 3 import java.io.IOException; 4 import java.io.ObjectInputStream; 5 import java.io.ObjectOutputStream; 6 import java.io.OptionalDataException; 7 import java.io.Serializable; 8 import java.security.AccessControlContext; 9 import java.security.AccessController; 10 import java.security.PermissionCollection; 11 import java.security.PrivilegedActionException; 12 import java.security.PrivilegedExceptionAction; 13 import java.security.ProtectionDomain; 14 import java.text.DateFormat; 15 import java.text.DateFormatSymbols; 16 import java.util.concurrent.ConcurrentHashMap; 17 import java.util.concurrent.ConcurrentMap; 18 import sun.util.BuddhistCalendar; 19 import sun.util.calendar.ZoneInfo; 20 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來實現時間日期的格式化。
下面的代碼會給你們展現如何格式化時間日期:
1 public static void main(String[] args) { 2 /* 3 * 如下代碼用於向你們展現各個時間日期類對象的包含組件。 4 / 5 java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis()); 6 System.out.println(sqlDate.toString()); // 輸出結果:2012-09-01 7 java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis()); 8 System.out.println(sqlTime.toString()); // 輸出結果:12:35:11 9 java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis()); 10 System.out.println(sqlTimestamp.toString()); // 輸出結果:2012-09-01 12:36:33.544 11 java.util.Date utilDate = new java.util.Date(System.currentTimeMillis()); 12 System.out.println(utilDate.toString()); // 輸出結果:Sat Sep 01 12:37:34 CST 2012 13 java.util.Calendar cl = java.util.Calendar.getInstance(); 14 System.out.println(cl.getTime().toString()); // 輸出結果:Sat Sep 01 12:39:51 CST 2012 15
16 / 17 * 如下代碼用於試驗java.sql.Date和java.sql.Time是否具備完整組件。 18 / 19 System.out.println(); 20 try { 21 System.out.println(sqlDate.getHours()); 22 } catch (Exception e) { 23 System.out.println(e.getMessage()); // 輸出 null 24 } 25 try { 26 System.out.println(sqlTime.getDate()); 27 } catch (Exception e) { 28 System.out.println(e.getMessage()); // 輸出 null 29 } 30
31 / 32 * 下面的代碼給你們展現時間日期的格式化。 33 */ 34 System.out.println(); 35 java.text.DateFormat dateFormat = java.text.SimpleDateFormat.getInstance(); 36 // java.util.Date本來的格式 37 System.out.println(utilDate.toString()); // 輸出:Sat Sep 01 13:16:13 CST 2012 38 // java.util.Date格式化後的格式 39 System.out.println(dateFormat.format(sqlDate)); // 輸出:12-9-1 下午1:16 40 System.out.println(); 41 // 不少時候以上的結果並非咱們但願的,咱們但願更加自由、更見簡單的操做方式 42 // 此時,java.text.SimpleDateFormat就成了咱們的不二選擇 43 // SimpleDateFormat提供了無參和自定義格式參數的構造方法使咱們可以輕鬆地實現自定義格式化 44 java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 45 System.out.println(simpleDateFormat.format(sqlDate)); // 輸出:2012-09-01 13:20:41 下午 46 } (我不是爲了佔篇幅才貼上來重複代碼的哦^_^)
java.text.SimpleDateFormat的format方法使用參數提供了強大的格式化功能(另外,值得一提的是:它的parse方法也提供了強大的字符串轉化爲Date的功能)。您能夠參照如下表格進行選擇:
(上圖有一出錯誤:m和mm中,前者表示當分鐘數小於10會只佔用一個輸出位,即輸出0-9而不會輸出00-09)
好了,你們趕忙利用jdk進行時間日期的操做處理吧!