明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

轉(zhuǎn):java.util中的Date類

[摘要]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)日期和時(shí)間的信息,這時(shí)候你可以使用java.util中的Date類,在編寫Java源程序時(shí),情況很明顯,你必須通過“import java.util.*”引入java.util軟件包;而在編寫JSP源程序時(shí),由于Date不是JSP的默認(rèn)對(duì)象,你仍然必須通過“<%@ page import="java.util.*"”引入這個(gè)軟件包。此外,由于在java.sql中存在一個(gè)同名的Date類,為了將這兩者正確地區(qū)分,凡是用到j(luò)ava.util中的Date類時(shí),你最好將其寫成java.util.Date。
事實(shí)上,Date類并不僅僅表示日期,而是精確到毫秒。從這個(gè)角度看,也許將其稱為DateTime更為合適,在本文中,我們有時(shí)也將Date稱為日期,希望不會(huì)引起讀者的誤解。
在談到j(luò)ava.util中的Date類時(shí),我們經(jīng)常會(huì)提到UTC和GMT,這兩者幾乎是同一概念。它們都是指的格林尼治標(biāo)準(zhǔn)時(shí)間,只不過UTC的稱呼更為正式一點(diǎn)。兩者的區(qū)別在于前者是一個(gè)天文上的概念,而后者是基于一個(gè)原子鐘。在UTC中,每一年或兩年會(huì)有一個(gè)“閏秒”,而我們一般不理會(huì)這個(gè)“閏秒”,但是在Java中,這造成我們有時(shí)會(huì)出現(xiàn)60秒或61秒。
Date類中有相應(yīng)的方法,它可以將日期分解為年、月、日、時(shí)、分、秒,可以將其轉(zhuǎn)換成一個(gè)字符串,它還可以執(zhí)行反向的操作。但是從JDK1.1開始,Calendar類和Date Format類也可以執(zhí)行這兩類的功能,按照J(rèn)ava的官方文件,相應(yīng)的在Date類中的方法不再推薦使用。但是在原理上,兩者并沒過大的差別。在本文中,我們?nèi)詫⒔榻B這些方法,只是會(huì)作相應(yīng)的注明。
在所有情況下,這些方法所接受的參數(shù)都不需要滿足有效范圍;例如,一個(gè)日期如果被定義為1月32日,它將被解釋為2月1日。

一、Date的構(gòu)造函數(shù)

1.1構(gòu)造一個(gè)反映當(dāng)時(shí)時(shí)間的Date實(shí)例
Date
public Date()
構(gòu)造一個(gè)Date對(duì)象并對(duì)其進(jìn)行初始化以反映當(dāng)前時(shí)間。

1.2從一個(gè)長(zhǎng)整型數(shù)據(jù)構(gòu)造一個(gè)Date實(shí)例
Date
public Date(long date)
構(gòu)造一個(gè)Date對(duì)象,并根據(jù)相對(duì)于GMT 1970年1月1日00:00:00的毫秒數(shù)對(duì)其進(jìn)行初始化。
參數(shù):
date - 相對(duì)于GMT 1970年1月1日00:00:00的毫秒數(shù)。

1.3從年月日時(shí)分秒構(gòu)造一個(gè)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è)構(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)造一個(gè)Date對(duì)象,并分別將其初始化為year、month和date所對(duì)應(yīng)日期的開始時(shí)間(即午夜)、year、month、date、hrs和min所對(duì)應(yīng)分鐘的開始時(shí)間、year、month、date、hrs、 min和sec所對(duì)應(yīng)秒的開始時(shí)間。
參數(shù):
year - 年份減去1900。
month - 月份在0-11之間。
date - 日期在1-31之間。
hrs - 小時(shí)在0-23之間。
min - 分鐘在0-59之間。
sec - 秒在0-59之間。

1.4從一個(gè)字符串構(gòu)造一個(gè)Date實(shí)例
Date
public Date(String s)
不推薦使用。 在JDK 1.1版中,被DateFormat.parse(String s)代替。
構(gòu)造一個(gè)Date對(duì)象,并將其初始化為字符串s所對(duì)象的日期和時(shí)間。對(duì)字符串的解析將和parse(java.lang.String)方法一樣。
參數(shù):
s - 一個(gè)反映日期的字符串。

二、其它方法

2.1將一個(gè)字符串轉(zhuǎn)換成Date對(duì)象相應(yīng)的長(zhǎng)整形表示
parse
public static long parse(String s)
不推薦使用。 在JDK 1.1版中,被DateFormat.parse(String s)代替。
試圖將字符串s作為日期和時(shí)間的表示來解析。如果解析是成功的,將返回相對(duì)于GMT 1970年1月1日00:00:00的毫秒數(shù)。反之,將拋出IllegalArgumentException例外。
它可以接受許多語(yǔ)句格式;具體地說,它可以理解這種格式:"Sat, 12 Aug 1995 13:30:00 GMT"。它也可以理解U.S.這樣的時(shí)區(qū)縮寫,但是通常,我們這樣表示時(shí)區(qū):"Sat, 12 Aug 1995 13:30:00 GMT+0430"。如果沒指明時(shí)區(qū),那就表示默認(rèn)當(dāng)前的時(shí)區(qū)。在這里,GMT和UTC表示相同的概念。
字符串s是從左到右進(jìn)行處理的。在“(”和“)”之間的字符將被忽略。括號(hào)可以嵌套。此外,該字符串只能包含以下字符:
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789,+-:/
和空格。
在該字符串中出現(xiàn)的數(shù)字將按以下規(guī)則解析:
如果一個(gè)數(shù)字以+或-開頭,而且年份已經(jīng)被驗(yàn)證,那么這個(gè)數(shù)字將被認(rèn)為是時(shí)區(qū)設(shè)置。如果這個(gè)數(shù)字小于24,這代表是時(shí)區(qū)偏移的小時(shí)。否則,就是時(shí)區(qū)偏移的分鐘。符號(hào)-表示西部的時(shí)區(qū)。時(shí)區(qū)設(shè)置總是相對(duì)于UTC的。這樣,例如,-5表示"格林尼治西5小時(shí)",而+0430 表示"格林尼治東4小時(shí)30分"。你也可以使用冗余的字符:GMT、UT和UTC。例如,GMT-5或utc+0430。
如果滿足下列條件之一,這個(gè)數(shù)字將表示年份:
1、數(shù)字等于或大于70而且后面跟著一個(gè)空格、逗號(hào)或斜杠,或者是在字符串的結(jié)尾。
2、如果數(shù)字小于70,而且月份或日期已經(jīng)被定義。
如果表示年份的數(shù)字小于100,這是一個(gè)縮寫,表示在當(dāng)前的80年之前、19年之后的一個(gè)區(qū)間中一個(gè)年份。如果當(dāng)前是1999年,那么19到99表示1919到1999,而0到18表示2000到2018。這里需要特別注意和SimpleDateFormat中的不同。
如果數(shù)字后面跟著一個(gè)冒號(hào),這表示小時(shí),除非小時(shí)已經(jīng)被定義。在小時(shí)已經(jīng)被定義的情況下,這表示分鐘。
如果數(shù)字后面跟著一個(gè)斜杠,這表示月份(這里0到11表示一到十二月),除非月份已經(jīng)被定義。在月份已經(jīng)被定義的情況下,這表示日期。
如果數(shù)字后面跟著一個(gè)空格、逗號(hào)或連字號(hào),或者是在字符串的結(jié)尾,在已經(jīng)定義了小時(shí)但還沒有定義分鐘的情況下,這表示分鐘;在已經(jīng)定義了小時(shí)和分鐘但還沒有定義秒的情況下,這表示秒;否則這表示日期。
在該字符串中出現(xiàn)的字母將按以下規(guī)則解析:
AM(忽略大小寫),將被忽略(但是如果小時(shí)未被定義、小于1或大于12,解析將失敗)。
PM(忽略大小寫),將在小時(shí)后加12(但是如果小時(shí)未被定義、小于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(忽略大小寫),將被視為北美的時(shí)區(qū),分別是格林尼治西5小時(shí)、6小時(shí)、7小時(shí)、8小時(shí)。而EDT, CDT, MDT和PDT表示同一概念。
當(dāng)全部字符串被掃描時(shí),如果時(shí)區(qū)被定義,時(shí)間被認(rèn)為是UTC的時(shí)間,然后再應(yīng)用時(shí)區(qū)。否則,時(shí)間指當(dāng)前時(shí)區(qū)的時(shí)間。
參數(shù):
s - 一個(gè)作為日期解析的日期。
返回:
相對(duì)于GMT 1970年1月1日00:00:00的毫秒數(shù)。
2.2獲取Date對(duì)象中的年、月、日、時(shí)、分、秒元素以及星期
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所對(duì)應(yīng)年份減去1900。
返回Date對(duì)象所對(duì)應(yīng)的月份。返回值在0到11之間,0表示1月。
返加這個(gè)Date對(duì)象的日期。返回值在1到31之間。
返回這個(gè)日期的星期。(0 = 星期天, 1 = 星期一, 2 = 星期二, 3 = 星期三, 4 = 星期四, 5 = 星期五, 6 = 星期六)
返加這個(gè)Date對(duì)象的小時(shí)。返回值是一個(gè)0到23的數(shù)字。
返回這個(gè)日期的分鐘,返回值在0到59之間。
返回日期的秒。返回值在0到61之間。60和61 僅僅在Java虛擬機(jī)在處理閏秒時(shí)出現(xiàn)。

2.3設(shè)置Date對(duì)象中的年、月、日、時(shí)、分、秒元素
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對(duì)象的年份為指定值加1900。Date對(duì)象的其它屬性不變(如果日期是2月29日,而所設(shè)置的年是非閏年,新的日期將是3月1日。)
設(shè)置日期的月份為指定值。日期的其它元素不變。如果日期是10月31日,而現(xiàn)在月份設(shè)為6月,新的日期將是7月1日,因?yàn)?月只有30天。
設(shè)置Date對(duì)象的日期為指定值。日期的其它元素不變。如果日期是4月31日,而現(xiàn)在日期設(shè)為31日,新的日期將是5月1日,因?yàn)?月只有30天。
設(shè)置這個(gè)Date對(duì)象的小時(shí),日期的其它元素不變。
設(shè)置這個(gè)Date對(duì)象的分鐘為指定值,日期的其它元素不變。
將這個(gè)Date對(duì)象的秒設(shè)置為指定值。對(duì)象的其它屬性不變。
其參數(shù)依次為:
year - 年份。
month - 月份在0-11之間。
date - 日期在1-31之間。
hours - 小時(shí)值。
minutes - 分鐘。
seconds - 秒。

2.4兩個(gè)日期對(duì)象的比較
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)
其功能依次為:
測(cè)試這個(gè)日期是否在指定日期之前。
測(cè)試這個(gè)日期是否在指定日期之后。
比較兩個(gè)日期是否相等。當(dāng)且僅當(dāng)參數(shù)不為空,而且參數(shù)與這個(gè)Date對(duì)象完全相等時(shí)(精確到毫秒級(jí)),返回true。事實(shí)上,兩個(gè)Date對(duì)象相等,也就是說getTime方法返回同一個(gè)長(zhǎng)整型數(shù)據(jù)。
比較兩個(gè)日期的順序。
將這個(gè)日期與另一個(gè)對(duì)象比較。如果這個(gè)對(duì)象是一個(gè)日期,其功能將與compareTo(Date)完全相似。否則會(huì)拋出一個(gè)ClassCastException例外(因?yàn)槿掌谥荒芘c另一個(gè)日期比較)。
其參數(shù)依次為:
when - 一個(gè)日期。
when - 一個(gè)日期。
obj - 用來比較的對(duì)象。
anotherDate - 用來比較的Date。
o - 用來比較的Object。
返回依次為:
當(dāng)且僅當(dāng)這個(gè)Date對(duì)象早于when時(shí)返回true;否則返回false。
當(dāng)且僅當(dāng)這個(gè)Date對(duì)象遲于when時(shí)返回true;否則返回false。
兩個(gè)對(duì)象相等時(shí)返回true,否則返回false。
如果兩個(gè)日期相等返回0;如果日期在參數(shù)值之前返回小于0的數(shù)值;如果日期在參數(shù)值之前返回大于0的數(shù)值。
如果兩個(gè)日期相等返回0;如果日期在參數(shù)值之前返回小于0的數(shù)值;如果日期在參數(shù)值之前返回大于0的數(shù)值。

2.5日期對(duì)象及其對(duì)應(yīng)的長(zhǎng)整型表示
getTime
public long getTime()
返回這個(gè)Date對(duì)象相對(duì)于GMT 1970年1月1日00:00:00的毫秒數(shù)。
返回:
相對(duì)于GMT 1970年1月1日00:00:00的毫秒數(shù)。

setTime
public void setTime(long time)
按照相對(duì)于GMT 1970年1月1日00:00:00的毫秒數(shù)設(shè)置這個(gè)Date對(duì)象。
參數(shù):
time - 毫秒數(shù)。

2.6其它
clone
public Object clone()
返回這個(gè)對(duì)象的一個(gè)拷貝。
返回:
這個(gè)實(shí)例的一個(gè)拷貝。
拋出:
CloneNotSupportedException - 如果這個(gè)對(duì)象的類不支持Cloneable接口。將拋出這個(gè)例外。
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í)間。這個(gè)參數(shù)被解析為年、月、日、時(shí)、分、秒。就和在Date 構(gòu)造函數(shù)中一樣,只不過是使用的UTC而不是使用當(dāng)前時(shí)區(qū)。這個(gè)時(shí)間將被表示為相對(duì)于GMT 1970年1月1日00:00:00的毫秒數(shù)。
參數(shù):
year - 年份減去1900。
month - 月份在0-11之間。
date - 日期在1-31之間。
hrs - 小時(shí)在0-23之間。
min - 分鐘在0-59之間。
sec - 秒在0-59之間。
返回:
參數(shù)所對(duì)應(yīng)日期相對(duì)于GMT 1970年1月1日00:00:00的毫秒數(shù)。

hashCode
public int hashCode()
返回這個(gè)對(duì)象的hash代碼值,也就是說對(duì)getTime()方法返回的長(zhǎng)整型數(shù)值作如下運(yùn)算:
(int)(this.getTime()^(this.getTime() >>> 32))
返回:
這個(gè)對(duì)象的hash代碼值。

toString
public String toString()
將這個(gè)Date對(duì)象轉(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是小時(shí)(00到23),用兩位數(shù)字表示。
mm是分鐘(00到59),用兩位數(shù)字表示。
ss是秒(00到61,用兩位數(shù)字表示。
zzz是時(shí)區(qū)。標(biāo)準(zhǔn)的時(shí)區(qū)的縮寫和在parse方法中的一樣。如果時(shí)區(qū)信息無效zzz為空 - 也就是說,不包含任何字符。
yyyy是年份,用四位數(shù)字表示。
返回:
表示這個(gè)日期的字符串。

toLocaleString
public String toLocaleString()
不推薦使用。 JDK 1.1版中,被DateFormat.format(Date date)代替。
按照當(dāng)前格式生成反映這個(gè)Date對(duì)象的字符串。這種格式字符串對(duì)于Java應(yīng)用程序開發(fā)員應(yīng)該是相當(dāng)熟悉的。然而,它與ISO C中strftime()函數(shù)的"%c"格式并不完全相同。
返回:
反映這個(gè)日期的字符串,使用當(dāng)前的約定。

toGMTString
public String toGMTString()
不推薦使用。 JDK 1.1版中,被DateFormat.format(Date date)(使用GMT 時(shí)區(qū))代替。
按以下格式建立一個(gè)反映這個(gè)Date對(duì)象的字符串: 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小時(shí)(00到23),用兩位數(shù)字表示。
mm分鐘(00到59),用兩位數(shù)字表示。
ss秒(00到61),用兩位數(shù)字表示。
GMT指定為格林尼治標(biāo)準(zhǔn)時(shí)。
返回值與當(dāng)前時(shí)區(qū)無關(guān)。
返回:
反映當(dāng)前日期的字符串(使用Internet GMT)。

getTimezoneOffset
public int getTimezoneOffset()
不推薦使用。 JDK 1.1版中,被Calendar.get(Calendar.ZONE_OFFSET) + Calendar.get(Calendar.DST_OFFSET)代替。
返回時(shí)區(qū),精確到分鐘。
例如,在麻薩諸塞州,應(yīng)該是格林尼治西5小時(shí):
new Date(96, 1, 14).getTimezoneOffset()返回300,因?yàn)樵?996年1月14日,使用標(biāo)準(zhǔn)時(shí)間(東部標(biāo)準(zhǔn)時(shí));但是,new Date(96, 5, 1).getTimezoneOffset()返回240,因?yàn)樵?996年5月1日,使用夏令時(shí)(東部夏令時(shí))。
這個(gè)方法返回值和下列計(jì)算的結(jié)果一樣:
(this.getTime() - UTC(this.getYear(),
this.getMonth(),
this.getDate(),
this.getHours(),
this.getMinutes(),
this.getSeconds())) / (60 * 1000)
返回值:
當(dāng)前時(shí)區(qū)的設(shè)置,精確到分鐘。