天天看點

java中幾個時間的差別(java.sql.date,java.sql.time,java.sql.Timestamp)

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、以及與MySQL日期類型的對應

一、java.util.Date表示某一特定時刻,精确到毫秒。

java.util.Date日期格式為:年月日時分秒 

類聲明如下:

public class Date

    implements java.io.Serializable, Cloneable, Comparable<Date>

類的構造函數:

1.Date();以系統目前時間初始化該對象。

2.Date(long date);用毫秒數初始化對象,以1970年1月1日00:00:00 GMT标準基準時間的毫秒數,即要初始化的時間減去1970年的時間的毫秒數。

該類的常用函數

1 boolean after(Date when) 

此方法測試,此日期是否在指定日期之後。

2 boolean before(Date when) 

此方法測試,此日期是否在指定日期之前。

3 Object clone() 

此方法傳回此對象的一個副本。

4 int compareTo(Date anotherDate) 

此方法比較兩個日期的順序。

5 boolean equals(Object obj) 

此方法比較兩個日期是否相等。

6 long getTime() 

此方法傳回自1970年1月1日00:00:00 GMT此Date對象表示的毫秒數。

7 int hashCode() 

此方法傳回此對象的哈希碼值。

8 void setTime(long time) 

此方法設定此Date對象1970年1月1日00:00:00 GMT以後,代表一個時間點time毫秒。

9 String toString() 

此方法此Date對象轉換為形式的字元串。

二、java.sql.Date、java.sql.Time、java.sql.Timestamp

java.lang.Object 

....|__java.util.Date 

..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time

....|__java.security.Timestamp

java.sql.Date日期格式為:年月日[隻存儲日期資料不存儲時間資料] 

java.sql.Time日期格式為:時分秒 

java.sql.Timestamp日期格式為:年月日時分秒納秒(毫微秒)

    java.sql.Date,  java.sql.Time,  java.slq.Timestamp這三個類是java.util.Date的子類。這三個類對java.util.Date類進行了包裝。

聯系:

    java.sql.Date類屏蔽了java.util.Date類的時間有關的方法(形如:hh:mm:ss),是以,不可以通過這個類通路時間有關的資訊,比如,如果你通過sqlDate.getHour()方法去通路小時資訊,此方法會抛出一個IllegalArgumentException異常。這是因為java.sql.Date在繼承java.util.Date類的時候對父類進行了重寫,禁用了時間通路的方法。之是以這麼處理,是為了和資料庫的Date資料類型相比對,資料庫的Date資料類行隻是儲存日期有關的字段。

    Java.sql.Time類屏蔽了java.util.Date的日期有關的字段(形如:yyyy-MM-dd),是以,不能通過這個類通路日期有關的資訊,比如:如果你通過sqlTime.getYear()方法去擷取年有關的資訊,此方法會抛出一個IllegalArgumentException異常。這是因為java.sql.Time在繼承java.util.Date類的時候對父類進行了重寫,禁用了日期通路的方法。之是以這麼處理,是為了和資料庫的Time資料類型相比對,資料庫的Time資料類行隻是儲存時間有關的字段。

  Java.sql.Timestamp字段則對java.util.Date這個類進行了擴充,它在java.util.Date類的基礎上增加了毫秒的時間通路控制,是以,你可以通過getNanos()方法去擷取時間的毫微秒數(注意此處擷取的時間是以毫微秒為機關的,1秒等于十億毫微秒),同樣的,這也是為了和資料庫中的Timestamp資料類型進行比對。

三、MySQL資料中的日期類型

MySQL 日期類型:日期格式、所占存儲空間、日期範圍 比較。 

日期類型        存儲空間       日期格式                 日期範圍 

------------ ---------   --------------------- ----------------------------------------- 

datetime       8 bytes   YYYY-MM-DD HH:MM:SS   1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 

timestamp      4 bytes   YYYY-MM-DD HH:MM:SS   1970-01-01 00:00:01 ~ 2038 

date           3 bytes   YYYY-MM-DD            1000-01-01          ~ 9999-12-31 

year           1 bytes   YYYY                  1901                ~ 2155

在 MySQL 中建立表時,對照上面的表格,很容易就能選擇到合适自己的資料類型。不過到底是選擇 datetime 還是 timestamp,可能會有點犯難。這兩個日期時間類型各有優點:datetime 的日期範圍比較大;timestamp 所占存儲空間比較小,隻是 datetime 的一半。

timestamp 類型的列還有個特性:預設情況下,在 insert, update 資料時,timestamp 列會自動以目前時間(CURRENT_TIMESTAMP)填充/更新。“自動”的意思就是,你不去管它,MySQL 會替你去處理。 

建表的代碼為:

create table t8 (

  `id1` timestamp NOT NULL default CURRENT_TIMESTAMP,

  `id2` datetime default NULL

);

兩者之間的比較:

1. timestamp容易所支援的範圍比timedate要小。 并且容易出現超出的情況

2.timestamp比較受時區timezone的影響以及MYSQL版本和伺服器的SQL MODE的影響.   

MySQL 時間類型:時間格式、所占存儲空間、時間範圍。 

時間類型        存儲空間      時間格式                 時間範圍 

------------ ---------   --------------------- ----------------------------------------- 

time           3 bytes   HH:MM:SS              -838:59:59          ~ 838:59:59

time 時間範圍居然有這麼大的範圍,特别是 time 可以取負值,有點奇怪。後來,看了 MySQL 手冊才知道這是為了滿足兩個日期時間相減才這樣設計的。

select timediff('2000:01:31 23:59:59', '2000:01:01 00:00:00'); -- 743:59:59 

select timediff('2000:01:01 00:00:00', '2000:01:31 23:59:59'); -- -743:59:59 

select timediff('23:59:59', '12:00:00');                        -- 11:59:59

注意,timediff 的兩個參數隻能是 datetime/timestamp, time 類型的,并且這兩個參數類型要相同。即:datetime/timestamp 和 datetime/timestamp 比較;time 和 time 相比較。

雖然 MySQL 中的日期時間類型比較豐富,但遺憾的是,目前(2008-08-08)這些日期時間類型隻能支援到秒級别,不支援毫秒、微秒。也沒有産生毫秒的函數。

相關連結:http://www.jb51.net/article/23966.htm

http://www.iteye.com/topic/1137830

http://www.yiibai.com/java/util/java_util_date.html