轉(zhuǎn):java.util中的Date類
發(fā)表時間:2024-06-16 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]java.util中的Date類www.linuxaid.com.cn 01-09-20 23:03 496p 處處-------------------------------------------------------------------------------- 在JSP中,我們經(jīng)常...
java.util中的Date類
www.linuxaid.com.cn 01-09-20 23:03 496p 處處
--------------------------------------------------------------------------------
在JSP中,我們經(jīng)常要處理有關(guān)日期和時間的信息,這時候你可以使用java.util中的Date類,在編寫Java源程序時,情況很明顯,你必須通過“import java.util.*”引入java.util軟件包;而在編寫JSP源程序時,由于Date不是JSP的默認(rèn)對象,你仍然必須通過“<%@ page import="java.util.*"”引入這個軟件包。此外,由于在java.sql中存在一個同名的Date類,為了將這兩者正確地區(qū)分,凡是用到j(luò)ava.util中的Date類時,你最好將其寫成java.util.Date。
事實(shí)上,Date類并不僅僅表示日期,而是精確到毫秒。從這個角度看,也許將其稱為DateTime更為合適,在本文中,我們有時也將Date稱為日期,希望不會引起讀者的誤解。
在談到j(luò)ava.util中的Date類時,我們經(jīng)常會提到UTC和GMT,這兩者幾乎是同一概念。它們都是指的格林尼治標(biāo)準(zhǔn)時間,只不過UTC的稱呼更為正式一點(diǎn)。兩者的區(qū)別在于前者是一個天文上的概念,而后者是基于一個原子鐘。在UTC中,每一年或兩年會有一個“閏秒”,而我們一般不理會這個“閏秒”,但是在Java中,這造成我們有時會出現(xiàn)60秒或61秒。
Date類中有相應(yīng)的方法,它可以將日期分解為年、月、日、時、分、秒,可以將其轉(zhuǎn)換成一個字符串,它還可以執(zhí)行反向的操作。但是從JDK1.1開始,Calendar類和Date Format類也可以執(zhí)行這兩類的功能,按照J(rèn)ava的官方文件,相應(yīng)的在Date類中的方法不再推薦使用。但是在原理上,兩者并沒過大的差別。在本文中,我們?nèi)詫⒔榻B這些方法,只是會作相應(yīng)的注明。
在所有情況下,這些方法所接受的參數(shù)都不需要滿足有效范圍;例如,一個日期如果被定義為1月32日,它將被解釋為2月1日。
一、Date的構(gòu)造函數(shù)
1.1構(gòu)造一個反映當(dāng)時時間的Date實(shí)例
Date
public Date()
構(gòu)造一個Date對象并對其進(jìn)行初始化以反映當(dāng)前時間。
1.2從一個長整型數(shù)據(jù)構(gòu)造一個Date實(shí)例
Date
public Date(long date)
構(gòu)造一個Date對象,并根據(jù)相對于GMT 1970年1月1日00:00:00的毫秒數(shù)對其進(jìn)行初始化。
參數(shù):
date - 相對于GMT 1970年1月1日00:00:00的毫秒數(shù)。
1.3從年月日時分秒構(gòu)造一個Date實(shí)例
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)
這三個構(gòu)造函數(shù)均不推薦使用,在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)代替。
構(gòu)造一個Date對象,并分別將其初始化為year、month和date所對應(yīng)日期的開始時間(即午夜)、year、month、date、hrs和min所對應(yīng)分鐘的開始時間、year、month、date、hrs、 min和sec所對應(yīng)秒的開始時間。
參數(shù):
year - 年份減去1900。
month - 月份在0-11之間。
date - 日期在1-31之間。
hrs - 小時在0-23之間。
min - 分鐘在0-59之間。
sec - 秒在0-59之間。
1.4從一個字符串構(gòu)造一個Date實(shí)例
Date
public Date(String s)
不推薦使用。 在JDK 1.1版中,被DateFormat.parse(String s)代替。
構(gòu)造一個Date對象,并將其初始化為字符串s所對象的日期和時間。對字符串的解析將和parse(java.lang.String)方法一樣。
參數(shù):
s - 一個反映日期的字符串。
二、其它方法
2.1將一個字符串轉(zhuǎn)換成Date對象相應(yīng)的長整形表示
parse
public static long parse(String s)
不推薦使用。 在JDK 1.1版中,被DateFormat.parse(String s)代替。
試圖將字符串s作為日期和時間的表示來解析。如果解析是成功的,將返回相對于GMT 1970年1月1日00:00:00的毫秒數(shù)。反之,將拋出IllegalArgumentException例外。
它可以接受許多語句格式;具體地說,它可以理解這種格式:"Sat, 12 Aug 1995 13:30:00 GMT"。它也可以理解U.S.這樣的時區(qū)縮寫,但是通常,我們這樣表示時區(qū):"Sat, 12 Aug 1995 13:30:00 GMT+0430"。如果沒指明時區(qū),那就表示默認(rèn)當(dāng)前的時區(qū)。在這里,GMT和UTC表示相同的概念。
字符串s是從左到右進(jìn)行處理的。在“(”和“)”之間的字符將被忽略。括號可以嵌套。此外,該字符串只能包含以下字符:
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789,+-:/
和空格。
在該字符串中出現(xiàn)的數(shù)字將按以下規(guī)則解析:
如果一個數(shù)字以+或-開頭,而且年份已經(jīng)被驗(yàn)證,那么這個數(shù)字將被認(rèn)為是時區(qū)設(shè)置。如果這個數(shù)字小于24,這代表是時區(qū)偏移的小時。否則,就是時區(qū)偏移的分鐘。符號-表示西部的時區(qū)。時區(qū)設(shè)置總是相對于UTC的。這樣,例如,-5表示"格林尼治西5小時",而+0430 表示"格林尼治東4小時30分"。你也可以使用冗余的字符:GMT、UT和UTC。例如,GMT-5或utc+0430。
如果滿足下列條件之一,這個數(shù)字將表示年份:
1、數(shù)字等于或大于70而且后面跟著一個空格、逗號或斜杠,或者是在字符串的結(jié)尾。
2、如果數(shù)字小于70,而且月份或日期已經(jīng)被定義。
如果表示年份的數(shù)字小于100,這是一個縮寫,表示在當(dāng)前的80年之前、19年之后的一個區(qū)間中一個年份。如果當(dāng)前是1999年,那么19到99表示1919到1999,而0到18表示2000到2018。這里需要特別注意和SimpleDateFormat中的不同。
如果數(shù)字后面跟著一個冒號,這表示小時,除非小時已經(jīng)被定義。在小時已經(jīng)被定義的情況下,這表示分鐘。
如果數(shù)字后面跟著一個斜杠,這表示月份(這里0到11表示一到十二月),除非月份已經(jīng)被定義。在月份已經(jīng)被定義的情況下,這表示日期。
如果數(shù)字后面跟著一個空格、逗號或連字號,或者是在字符串的結(jié)尾,在已經(jīng)定義了小時但還沒有定義分鐘的情況下,這表示分鐘;在已經(jīng)定義了小時和分鐘但還沒有定義秒的情況下,這表示秒;否則這表示日期。
在該字符串中出現(xiàn)的字母將按以下規(guī)則解析:
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以及它們的前綴(忽略大小寫),將按這里的順序被視為表示月份并將其轉(zhuǎn)換成數(shù)字(0 to 11)。例如,aug, Sept, april和NOV都表示月份。而Ma將被理解為MARCH而不是MAY。
GMT, UT和UTC(忽略大小寫),將被視為UTC。
EST, CST, MST和PST(忽略大小寫),將被視為北美的時區(qū),分別是格林尼治西5小時、6小時、7小時、8小時。而EDT, CDT, MDT和PDT表示同一概念。
當(dāng)全部字符串被掃描時,如果時區(qū)被定義,時間被認(rèn)為是UTC的時間,然后再應(yīng)用時區(qū)。否則,時間指當(dāng)前時區(qū)的時間。
參數(shù):
s - 一個作為日期解析的日期。
返回:
相對于GMT 1970年1月1日00:00:00的毫秒數(shù)。
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所對應(yīng)年份減去1900。
返回Date對象所對應(yīng)的月份。返回值在0到11之間,0表示1月。
返加這個Date對象的日期。返回值在1到31之間。
返回這個日期的星期。(0 = 星期天, 1 = 星期一, 2 = 星期二, 3 = 星期三, 4 = 星期四, 5 = 星期五, 6 = 星期六)
返加這個Date對象的小時。返回值是一個0到23的數(shù)字。
返回這個日期的分鐘,返回值在0到59之間。
返回日期的秒。返回值在0到61之間。60和61 僅僅在Java虛擬機(jī)在處理閏秒時出現(xiàn)。
2.3設(shè)置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)代替。
其功能依次為:
設(shè)置Date對象的年份為指定值加1900。Date對象的其它屬性不變(如果日期是2月29日,而所設(shè)置的年是非閏年,新的日期將是3月1日。)
設(shè)置日期的月份為指定值。日期的其它元素不變。如果日期是10月31日,而現(xiàn)在月份設(shè)為6月,新的日期將是7月1日,因?yàn)?月只有30天。
設(shè)置Date對象的日期為指定值。日期的其它元素不變。如果日期是4月31日,而現(xiàn)在日期設(shè)為31日,新的日期將是5月1日,因?yàn)?月只有30天。
設(shè)置這個Date對象的小時,日期的其它元素不變。
設(shè)置這個Date對象的分鐘為指定值,日期的其它元素不變。
將這個Date對象的秒設(shè)置為指定值。對象的其它屬性不變。
其參數(shù)依次為:
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)
其功能依次為:
測試這個日期是否在指定日期之前。
測試這個日期是否在指定日期之后。
比較兩個日期是否相等。當(dāng)且僅當(dāng)參數(shù)不為空,而且參數(shù)與這個Date對象完全相等時(精確到毫秒級),返回true。事實(shí)上,兩個Date對象相等,也就是說getTime方法返回同一個長整型數(shù)據(jù)。
比較兩個日期的順序。
將這個日期與另一個對象比較。如果這個對象是一個日期,其功能將與compareTo(Date)完全相似。否則會拋出一個ClassCastException例外(因?yàn)槿掌谥荒芘c另一個日期比較)。
其參數(shù)依次為:
when - 一個日期。
when - 一個日期。
obj - 用來比較的對象。
anotherDate - 用來比較的Date。
o - 用來比較的Object。
返回依次為:
當(dāng)且僅當(dāng)這個Date對象早于when時返回true;否則返回false。
當(dāng)且僅當(dāng)這個Date對象遲于when時返回true;否則返回false。
兩個對象相等時返回true,否則返回false。
如果兩個日期相等返回0;如果日期在參數(shù)值之前返回小于0的數(shù)值;如果日期在參數(shù)值之前返回大于0的數(shù)值。
如果兩個日期相等返回0;如果日期在參數(shù)值之前返回小于0的數(shù)值;如果日期在參數(shù)值之前返回大于0的數(shù)值。
2.5日期對象及其對應(yīng)的長整型表示
getTime
public long getTime()
返回這個Date對象相對于GMT 1970年1月1日00:00:00的毫秒數(shù)。
返回:
相對于GMT 1970年1月1日00:00:00的毫秒數(shù)。
setTime
public void setTime(long time)
按照相對于GMT 1970年1月1日00:00:00的毫秒數(shù)設(shè)置這個Date對象。
參數(shù):
time - 毫秒數(shù)。
2.6其它
clone
public Object clone()
返回這個對象的一個拷貝。
返回:
這個實(shí)例的一個拷貝。
拋出:
CloneNotSupportedException - 如果這個對象的類不支持Cloneable接口。將拋出這個例外。
OutOfMemoryError - 沒有足夠的內(nèi)存。
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() 后面所代替。
根據(jù)參數(shù)確定日期和時間。這個參數(shù)被解析為年、月、日、時、分、秒。就和在Date 構(gòu)造函數(shù)中一樣,只不過是使用的UTC而不是使用當(dāng)前時區(qū)。這個時間將被表示為相對于GMT 1970年1月1日00:00:00的毫秒數(shù)。
參數(shù):
year - 年份減去1900。
month - 月份在0-11之間。
date - 日期在1-31之間。
hrs - 小時在0-23之間。
min - 分鐘在0-59之間。
sec - 秒在0-59之間。
返回:
參數(shù)所對應(yīng)日期相對于GMT 1970年1月1日00:00:00的毫秒數(shù)。
hashCode
public int hashCode()
返回這個對象的hash代碼值,也就是說對getTime()方法返回的長整型數(shù)值作如下運(yùn)算:
(int)(this.getTime()^(this.getTime() >>> 32))
返回:
這個對象的hash代碼值。
toString
public String toString()
將這個Date對象轉(zhuǎn)換成如下格式的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),用兩位數(shù)字表示。
hh是小時(00到23),用兩位數(shù)字表示。
mm是分鐘(00到59),用兩位數(shù)字表示。
ss是秒(00到61,用兩位數(shù)字表示。
zzz是時區(qū)。標(biāo)準(zhǔn)的時區(qū)的縮寫和在parse方法中的一樣。如果時區(qū)信息無效zzz為空 - 也就是說,不包含任何字符。
yyyy是年份,用四位數(shù)字表示。
返回:
表示這個日期的字符串。
toLocaleString
public String toLocaleString()
不推薦使用。 JDK 1.1版中,被DateFormat.format(Date date)代替。
按照當(dāng)前格式生成反映這個Date對象的字符串。這種格式字符串對于Java應(yīng)用程序開發(fā)員應(yīng)該是相當(dāng)熟悉的。然而,它與ISO C中strftime()函數(shù)的"%c"格式并不完全相同。
返回:
反映這個日期的字符串,使用當(dāng)前的約定。
toGMTString
public String toGMTString()
不推薦使用。 JDK 1.1版中,被DateFormat.format(Date date)(使用GMT 時區(qū))代替。
按以下格式建立一個反映這個Date對象的字符串: d mon yyyy hh:mm:ss GMT
其中:
d日期(1到31),用一到兩位數(shù)字表示。
mon月份(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)。
yyyy年份,用四位數(shù)字表示。
hh小時(00到23),用兩位數(shù)字表示。
mm分鐘(00到59),用兩位數(shù)字表示。
ss秒(00到61),用兩位數(shù)字表示。
GMT指定為格林尼治標(biāo)準(zhǔn)時。
返回值與當(dāng)前時區(qū)無關(guān)。
返回:
反映當(dāng)前日期的字符串(使用Internet GMT)。
getTimezoneOffset
public int getTimezoneOffset()
不推薦使用。 JDK 1.1版中,被Calendar.get(Calendar.ZONE_OFFSET) + Calendar.get(Calendar.DST_OFFSET)代替。
返回時區(qū),精確到分鐘。
例如,在麻薩諸塞州,應(yīng)該是格林尼治西5小時:
new Date(96, 1, 14).getTimezoneOffset()返回300,因?yàn)樵?996年1月14日,使用標(biāo)準(zhǔn)時間(東部標(biāo)準(zhǔn)時);但是,new Date(96, 5, 1).getTimezoneOffset()返回240,因?yàn)樵?996年5月1日,使用夏令時(東部夏令時)。
這個方法返回值和下列計算的結(jié)果一樣:
(this.getTime() - UTC(this.getYear(),
this.getMonth(),
this.getDate(),
this.getHours(),
this.getMinutes(),
this.getSeconds())) / (60 * 1000)
返回值:
當(dāng)前時區(qū)的設(shè)置,精確到分鐘。