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