【Java】Java中的時間日期處理

程序就是輸入——>處理——>輸出。對數據的處理是程序員須要着重注意的地方,快速、高效的對數據進行處理時咱們的追求。其中,時間日期的處理又尤其重要和平凡,這次,我將把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進行時間日期的操做處理吧!

相關文章
相關標籤/搜索