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)
返回值:
当前时区的设置,精确到分钟。