Java.util中的Date類
www.Linuxaid.com.cn 01-09-20 23:03 496p 處處
--------------------------------------------------------------------------------
在JSP中,我們經常要處理有關日期和時間的信息,這時候你可以使用java.util中的Date類,在編寫Java源程序時,情況很明顯,你必須通過“import java.util.*”引入java.util軟件包;而在編寫JSP源程序時,由於Date不是JSP的默認對象,你仍然必須通過“<%@ page import="java.util.*"”引入這個軟件包。此外,由於在java.sql中存在一個同名的Date類,為了將這兩者正確地區分,凡是用到java.util中的Date類時,你最好將其寫成Java.util.Date。
事實上,Date類並不僅僅表示日期,而是精確到毫秒。從這個角度看,也許將其稱為DateTime更為合適,在本文中,我們有時也將Date稱為日期,希望不會引起讀者的誤解。
在談到java.util中的Date類時,我們經常會提到UTC和GMT,這兩者幾乎是同一概念。它們都是指的格林尼治標准時間,只不過UTC的稱呼更為正式一點。兩者的區別在於前者是一個天文上的概念,而後者是基於一個原子鐘。在UTC中,每一年或兩年會有一個“閏秒”,而我們一般不理會這個“閏秒”,但是在Java中,這造成我們有時會出現60秒或61秒。
Date類中有相應的方法,它可以將日期分解為年、月、日、時、分、秒,可以將其轉換成一個字符串,它還可以執行反向的操作。但是從JDK1.1開始,Calendar類和Date Format類也可以執行這兩類的功能,按照Java的官方文件,相應的在Date類中的方法不再推薦使用。但是在原理上,兩者並沒過大的差別。在本文中,我們仍將介紹這些方法,只是會作相應的注明。
在所有情況下,這些方法所接受的參數都不需要滿足有效范圍;例如,一個日期如果被定義為1月32日,它將被解釋為2月1日。
一、Date的構造函數
1.1構造一個反映當時時間的Date實例
Date
public Date()
構造一個Date對象並對其進行初始化以反映當前時間。
1.2從一個長整型數據構造一個Date實例
Date
public Date(long date)
構造一個Date對象,並根據相對於GMT 1970年1月1日00:00:00的毫秒數對其進行初始化。
參數:
date - 相對於GMT 1970年1月1日00:00:00的毫秒數。
1.3從年月日時分秒構造一個Date實例
Date
public Date(int year,
int month,
int date)
public Date(int year,
int month,
int date,
int hrs,
int min)
public Date(int year,
int month,
int date,
int hrs,
int min,
int sec)
這三個構造函數均不推薦使用,在JDK 1.1版中,分別被Calendar.set(year + 1900, month, date)或GregorianCalendar(year + 1900, month, date)、Calendar.set(year + 1900, month, date, hrs, min)或 GregorianCalendar(year + 1900, month, date, hrs, min)、Calendar.set(year + 1900, month, date, hrs, min, sec)或GregorianCalendar(year + 1900, month, date, hrs, min, sec)代替。
構造一個Date對象,並分別將其初始化為year、month和date所對應日期的開始時間(即午夜)、year、month、date、hrs和min所對應分鐘的開始時間、year、month、date、hrs、 min和sec所對應秒的開始時間。
參數:
year - 年份減去1900。
month - 月份在0-11之間。
date - 日期在1-31之間。
hrs - 小時在0-23之間。
min - 分鐘在0-59之間。
sec - 秒在0-59之間。
1.4從一個字符串構造一個Date實例
Date
public Date(String s)
不推薦使用。 在JDK 1.1版中,被DateFormat.parse(String s)代替。
構造一個Date對象,並將其初始化為字符串s所對象的日期和時間。對字符串的解析將和parse(Java.lang.String)方法一樣。
參數:
s - 一個反映日期的字符串。
二、其它方法
2.1將一個字符串轉換成Date對象相應的長整形表示
parse
public static long parse(String s)
不推薦使用。 在JDK 1.1版中,被DateFormat.parse(String s)代替。
試圖將字符串s作為日期和時間的表示來解析。如果解析是成功的,將返回相對於GMT 1970年1月1日00:00:00的毫秒數。反之,將拋出IllegalArgumentException例外。
它可以接受許多語句格式;具體地說,它可以理解這種格式:"Sat, 12 Aug 1995 13:30:00 GMT"。它也可以理解U.S.這樣的時區縮寫,但是通常,我們這樣表示時區:"Sat, 12 Aug 1995 13:30:00 GMT+0430"。如果沒指明時區,那就表示默認當前的時區。在這裡,GMT和UTC表示相同的概念。
字符串s是從左到右進行處理的。在“(”和“)”之間的字符將被忽略。括號可以嵌套。此外,該字符串只能包含以下字符:
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789,+-:/
和空格。
在該字符串中出現的數字將按以下規則解析:
如果一個數字以+或-開頭,而且年份已經被驗證,那麼這個數字將被認為是時區設置。如果這個數字小於24,這代表是時區偏移的小時。否則,就是時區偏移的分鐘。符號-表示西部的時區。時區設置總是相對於UTC的。這樣,例如,-5表示"格林尼治西5小時",而+0430 表示"格林尼治東4小時30分"。你也可以使用冗余的字符:GMT、UT和UTC。例如,GMT-5或utc+0430。
如果滿足下列條件之一,這個數字將表示年份:
1、數字等於或大於70而且後面跟著一個空格、逗號或斜槓,或者是在字符串的結尾。
2、如果數字小於70,而且月份或日期已經被定義。
如果表示年份的數字小於100,這是一個縮寫,表示在當前的80年之前、19年之後的一個區間中一個年份。如果當前是1999年,那麼19到99表示1919到1999,而0到18表示2000到2018。這裡需要特別注意和SimpleDateFormat中的不同。
如果數字後面跟著一個冒號,這表示小時,除非小時已經被定義。在小時已經被定義的情況下,這表示分鐘。
如果數字後面跟著一個斜槓,這表示月份(這裡0到11表示一到十二月),除非月份已經被定義。在月份已經被定義的情況下,這表示日期。
如果數字後面跟著一個空格、逗號或連字號,或者是在字符串的結尾,在已經定義了小時但還沒有定義分鐘的情況下,這表示分鐘;在已經定義了小時和分鐘但還沒有定義秒的情況下,這表示秒;否則這表示日期。
在該字符串中出現的字母將按以下規則解析:
AM(忽略大小寫),將被忽略(但是如果小時未被定義、小於1或大於12,解析將失敗)。
PM(忽略大小寫),將在小時後加12(但是如果小時未被定義、小於1或大於12,解析將失敗)。
SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY和SATURDAY以及它們的前綴(忽略大小寫),將被忽略。例如sat, Friday, TUE和Thurs都將被忽略。
此外,JANUARY、FEBRUARY、MARCH、APRIL、MAY、JUNE、JULY、AUGUST、SEPTEMBER、OCTOBER、NOVEMBER和DECEMBER以及它們的前綴(忽略大小寫),將按這裡的順序被視為表示月份並將其轉換成數字(0 to 11)。例如,aug, Sept, april和NOV都表示月份。而Ma將被理解為MARCH而不是MAY。
GMT, UT和UTC(忽略大小寫),將被視為UTC。
EST, CST, MST和PST(忽略大小寫),將被視為北美的時區,分別是格林尼治西5小時、6小時、7小時、8小時。而EDT, CDT, MDT和PDT表示同一概念。
當全部字符串被掃描時,如果時區被定義,時間被認為是UTC的時間,然後再應用時區。否則,時間指當前時區的時間。
參數:
s - 一個作為日期解析的日期。
返回:
相對於GMT 1970年1月1日00:00:00的毫秒數。
2.2獲取Date對象中的年、月、日、時、分、秒元素以及星期
getYear
public int getYear()
getMonth
public int getMonth()
getDate
public int getDate()
getDay
public int getDay()
getHours
public int getHours()
getMinutes
public int getMinutes()
getSeconds
public int getSeconds()
這組方法均不推薦使用。 JDK 1.1版中,分別被Calendar.get(Calendar.YEAR) - 1900、Calendar.get(Calendar.MONTH)、Calendar.get(Calendar.DAY_OF_MONTH)、Calendar.get(Calendar.DAY_OF_WEEK)、Calendar.get(Calendar.HOUR_OF_DAY)、Calendar.get(Calendar.MINUTE)、Calendar.get(Calendar.SECOND)代替。
其功能依次為:
返回Date所對應年份減去1900。
返回Date對象所對應的月份。返回值在0到11之間,0表示1月。
返加這個Date對象的日期。返回值在1到31之間。
返回這個日期的星期。(0 = 星期天, 1 = 星期一, 2 = 星期二, 3 = 星期三, 4 = 星期四, 5 = 星期五, 6 = 星期六)
返加這個Date對象的小時。返回值是一個0到23的數字。
返回這個日期的分鐘,返回值在0到59之間。
返回日期的秒。返回值在0到61之間。60和61 僅僅在Java虛擬機在處理閏秒時出現。
2.3設置Date對象中的年、月、日、時、分、秒元素
setYear
public void setYear(int year)
setMonth
public void setMonth(int month)
setDate
public void setDate(int date)
setHours
public void setHours(int hours)
setMinutes
public void setMinutes(int minutes)
setSeconds
public void setSeconds(int seconds)
這組方法均不推薦使用。在JDK 1.1版中,分別被Calendar.set(Calendar.YEAR, year + 1900)、Calendar.set(Calendar.MONTH, int month)、Calendar.set(Calendar.DAY_OF_MONTH, int date)、Calendar.set(Calendar.HOUR_OF_DAY, int hours)、Calendar.set(Calendar.MINUTE, int minutes)、Calendar.set(Calendar.SECOND, int seconds)代替。
其功能依次為:
設置Date對象的年份為指定值加1900。Date對象的其它屬性不變(如果日期是2月29日,而所設置的年是非閏年,新的日期將是3月1日。)
設置日期的月份為指定值。日期的其它元素不變。如果日期是10月31日,而現在月份設為6月,新的日期將是7月1日,因為6月只有30天。
設置Date對象的日期為指定值。日期的其它元素不變。如果日期是4月31日,而現在日期設為31日,新的日期將是5月1日,因為4月只有30天。
設置這個Date對象的小時,日期的其它元素不變。
設置這個Date對象的分鐘為指定值,日期的其它元素不變。
將這個Date對象的秒設置為指定值。對象的其它屬性不變。
其參數依次為:
year - 年份。
month - 月份在0-11之間。
date - 日期在1-31之間。
hours - 小時值。
minutes - 分鐘。
seconds - 秒。
2.4兩個日期對象的比較
before
public boolean before(Date when)
after
public boolean after(Date when)
equals
public boolean equals(Object obj)
compareTo
public int compareTo(Date anotherDate)
compareTo
public int compareTo(Object o)
其功能依次為:
測試這個日期是否在指定日期之前。
測試這個日期是否在指定日期之後。
比較兩個日期是否相等。當且僅當參數不為空,而且參數與這個Date對象完全相等時(精確到毫秒級),返回true。事實上,兩個Date對象相等,也就是說getTime方法返回同一個長整型數據。
比較兩個日期的順序。
將這個日期與另一個對象比較。如果這個對象是一個日期,其功能將與compareTo(Date)完全相似。否則會拋出一個ClassCastException例外(因為日期只能與另一個日期比較)。
其參數依次為:
when - 一個日期。
when - 一個日期。
obj - 用來比較的對象。
anotherDate - 用來比較的Date。
o - 用來比較的Object。
返回依次為:
當且僅當這個Date對象早於when時返回true;否則返回false。
當且僅當這個Date對象遲於when時返回true;否則返回false。
兩個對象相等時返回true,否則返回false。
如果兩個日期相等返回0;如果日期在參數值之前返回小於0的數值;如果日期在參數值之前返回大於0的數值。
如果兩個日期相等返回0;如果日期在參數值之前返回小於0的數值;如果日期在參數值之前返回大於0的數值。
2.5日期對象及其對應的長整型表示
getTime
public long getTime()
返回這個Date對象相對於GMT 1970年1月1日00:00:00的毫秒數。
返回:
相對於GMT 1970年1月1日00:00:00的毫秒數。
setTime
public void setTime(long time)
按照相對於GMT 1970年1月1日00:00:00的毫秒數設置這個Date對象。
參數:
time - 毫秒數。
2.6其它
clone
public Object clone()
返回這個對象的一個拷貝。
返回:
這個實例的一個拷貝。
拋出:
CloneNotSupportedException - 如果這個對象的類不支持Cloneable接口。將拋出這個例外。
OutOfMemoryError - 沒有足夠的內存。
UTC
public static long UTC(int year,
int month,
int date,
int hrs,
int min,
int sec)
不推薦使用。 在JDK 1.1版中,被Calendar.set(year + 1900, month, date, hrs, min, sec)或GregorianCalendar(year + 1900, month, date, hrs, min, sec), (使用UTC TimeZone),跟隨在Calendar.getTime().getTime() 後面所代替。
根據參數確定日期和時間。這個參數被解析為年、月、日、時、分、秒。就和在Date 構造函數中一樣,只不過是使用的UTC而不是使用當前時區。這個時間將被表示為相對於GMT 1970年1月1日00:00:00的毫秒數。
參數:
year - 年份減去1900。
month - 月份在0-11之間。
date - 日期在1-31之間。
hrs - 小時在0-23之間。
min - 分鐘在0-59之間。
sec - 秒在0-59之間。
返回:
參數所對應日期相對於GMT 1970年1月1日00:00:00的毫秒數。
hashCode
public int hashCode()
返回這個對象的hash代碼值,也就是說對getTime()方法返回的長整型數值作如下運算:
(int)(this.getTime()^(this.getTime() >>> 32))
返回:
這個對象的hash代碼值。
toString
public String toString()
將這個Date對象轉換成如下格式的String:
dow mon dd hh:mm:ss zzz yyyy
在這裡:
dow是星期(Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
mon是月份(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)。
dd是日期(01到31),用兩位數字表示。
hh是小時(00到23),用兩位數字表示。
mm是分鐘(00到59),用兩位數字表示。
ss是秒(00到61,用兩位數字表示。
zzz是時區。標准的時區的縮寫和在parse方法中的一樣。如果時區信息無效zzz為空 - 也就是說,不包含任何字符。
yyyy是年份,用四位數字表示。
返回:
表示這個日期的字符串。
toLocaleString
public String toLocaleString()
不推薦使用。 JDK 1.1版中,被DateFormat.format(Date date)代替。
按照當前格式生成反映這個Date對象的字符串。這種格式字符串對於Java應用程序開發員應該是相當熟悉的。然而,它與ISO C中strftime()函數的"%c"格式並不完全相同。
返回:
反映這個日期的字符串,使用當前的約定。
toGMTString
public String toGMTString()
不推薦使用。 JDK 1.1版中,被DateFormat.format(Date date)(使用GMT 時區)代替。
按以下格式建立一個反映這個Date對象的字符串: d mon yyyy hh:mm:ss GMT
其中:
d日期(1到31),用一到兩位數字表示。
mon月份(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)。
yyyy年份,用四位數字表示。
hh小時(00到23),用兩位數字表示。
mm分鐘(00到59),用兩位數字表示。
ss秒(00到61),用兩位數字表示。
GMT指定為格林尼治標准時。
返回值與當前時區無關。
返回:
反映當前日期的字符串(使用Internet GMT)。
getTimezoneOffset
public int getTimezoneOffset()
不推薦使用。 JDK 1.1版中,被Calendar.get(Calendar.ZONE_OFFSET) + Calendar.get(Calendar.DST_OFFSET)代替。
返回時區,精確到分鐘。
例如,在麻薩諸塞州,應該是格林尼治西5小時:
new Date(96, 1, 14).getTimezoneOffset()返回300,因為在1996年1月14日,使用標准時間(東部標准時);但是,new Date(96, 5, 1).getTimezoneOffset()返回240,因為在1996年5月1日,使用夏令時(東部夏令時)。
這個方法返回值和下列計算的結果一樣:
(this.getTime() - UTC(this.getYear(),
this.getMonth(),
this.getDate(),
this.getHours(),
this.getMinutes(),
this.getSeconds())) / (60 * 1000)
返回值:
當前時區的設置,精確到分鐘。