Java 教程
java.util 包提供了 Date 類來封裝當(dāng)前的日期和時間。 Date 類提供兩個構(gòu)造函數(shù)來實(shí)例化 Date 對象。
第一個構(gòu)造函數(shù)使用當(dāng)前日期和時間來初始化對象。
第二個構(gòu)造函數(shù)接收一個參數(shù),該參數(shù)是從1970年1月1日起的毫秒數(shù)。
Date對象創(chuàng)建以后,可以調(diào)用下面的方法。
序號 | 方法和描述 |
---|---|
1 |
boolean after(Date date) 若當(dāng)調(diào)用此方法的Date對象在指定日期之后返回true,否則返回false。 |
2 |
boolean before(Date date) 若當(dāng)調(diào)用此方法的Date對象在指定日期之前返回true,否則返回false。 |
3 |
Object clone( ) 返回此對象的副本。 |
4 |
int compareTo(Date date) 比較當(dāng)調(diào)用此方法的Date對象和指定日期。兩者相等時候返回0。調(diào)用對象在指定日期之前則返回負(fù)數(shù)。調(diào)用對象在指定日期之后則返回正數(shù)。 |
5 |
int compareTo(Object obj) 若obj是Date類型則操作等同于compareTo(Date) 。否則它拋出ClassCastException。 |
6 |
boolean equals(Object date) 當(dāng)調(diào)用此方法的Date對象和指定日期相等時候返回true,否則返回false。 |
7 |
long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數(shù)。 |
8 |
int hashCode( ) ?返回此對象的哈希碼值。 |
9 |
void setTime(long time) ? 用自1970年1月1日00:00:00 GMT以后time毫秒數(shù)設(shè)置時間和日期。 |
10 |
String toString( ) 把此 Date 對象轉(zhuǎn)換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 |
Java中獲取當(dāng)前日期和時間很簡單,使用 Date 對象的 toString() 方法來打印當(dāng)前日期和時間,如下所示:
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Mon May 04 09:51:52 CDT 2013
Java使用以下三種方法來比較兩個日期:
SimpleDateFormat 是一個以語言環(huán)境敏感的方式來格式化和分析日期的類。SimpleDateFormat 允許你選擇任何用戶自定義日期時間格式來運(yùn)行。例如:
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
這一行代碼確立了轉(zhuǎn)換的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是時、分、秒。
注意:有的格式大寫,有的格式小寫,例如 MM 是月份,mm 是分;HH 是 24 小時制,而 hh 是 12 小時制。
以上實(shí)例編譯運(yùn)行結(jié)果如下:
當(dāng)前時間為: 2018-09-06 10:16:34
時間模式字符串用來指定時間格式。在此模式中,所有的 ASCII 字母被保留為模式字母,定義如下:
字母 | 描述 | 示例 |
---|---|---|
G | 紀(jì)元標(biāo)記 | AD |
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一個月的日期 | 10 |
h | ?A.M./P.M. (1~12)格式小時 | 12 |
H | 一天中的小時 (0~23) | 22 |
m | 分鐘數(shù) | 30 |
s | 秒數(shù) | 55 |
S | 毫秒數(shù) | 234 |
E | 星期幾 | Tuesday |
D | 一年中的日子 | 360 |
F | 一個月中第幾周的周幾 | 2 (second Wed. in July) |
w | 一年中第幾周 | 40 |
W | 一個月中第幾周 | 1 |
a | A.M./P.M. 標(biāo)記 | PM |
k | 一天中的小時(1~24) | 24 |
K | ?A.M./P.M. (0~11)格式小時 | 10 |
z | 時區(qū) | Eastern Standard Time |
' | 文字定界符 | Delimiter |
" | 單引號 | ` |
printf 方法可以很輕松地格式化時間和日期。使用兩個字母格式,它以 %t 開頭并且以下面表格中的一個字母結(jié)尾。
轉(zhuǎn)? 換? 符 |
說??? 明 |
示??? 例 |
---|---|---|
c |
包括全部日期和時間信息 |
星期六 十月 27 14:21:20 CST 2007 |
F |
"年-月-日"格式 |
2007-10-27 |
D |
"月/日/年"格式 |
10/27/07 |
r |
"HH:MM:SS PM"格式(12時制) |
02:25:51 下午 |
T |
"HH:MM:SS"格式(24時制) |
14:28:16 |
R |
"HH:MM"格式(24時制) |
14:28 |
更多 printf 解析可以參見:Java 格式化輸出 printf 例子
以上實(shí)例編譯運(yùn)行結(jié)果如下:
全部日期和時間信息:星期一 九月 10 10:43:36 CST 2012 年-月-日格式:2012-09-10 月/日/年格式:09/10/12 HH:MM:SS PM格式(12時制):10:43:36 上午 HH:MM:SS格式(24時制):10:43:36 HH:MM格式(24時制):10:43
如果你需要重復(fù)提供日期,那么利用這種方式來格式化它的每一部分就有點(diǎn)復(fù)雜了。因此,可以利用一個格式化字符串指出要被格式化的參數(shù)的索引。
索引必須緊跟在%后面,而且必須以$結(jié)束。例如:
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Due date: February 09, 2014
或者,你可以使用 < 標(biāo)志。它表明先前被格式化的參數(shù)要被再次使用。例如:
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Due date: February 09, 2014
定義日期格式的轉(zhuǎn)換符可以使日期通過指定的轉(zhuǎn)換符生成新字符串。這些日期轉(zhuǎn)換符如下所示:
輸出結(jié)果為:
英文月份簡稱:May 本地月份簡稱:五月 英文月份全稱:May 本地月份全稱:五月 英文星期的簡稱:Thu 本地星期的簡稱:星期四 年的前兩位數(shù)字(不足兩位前面補(bǔ)0):20 年的后兩位數(shù)字(不足兩位前面補(bǔ)0):17 一年中的天數(shù)(即年的第幾天):124 兩位數(shù)字的月份(不足兩位前面補(bǔ)0):05 兩位數(shù)字的日(不足兩位前面補(bǔ)0):04 月份的日(前面不補(bǔ)0):4
SimpleDateFormat 類有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat 對象的格式化存儲來解析字符串。例如:
以上實(shí)例編譯運(yùn)行結(jié)果如下:
$ java DateDemo 1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818 $ java DateDemo 2007-12-01 2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007
sleep()使當(dāng)前線程進(jìn)入停滯狀態(tài)(阻塞當(dāng)前線程),讓出CPU的使用、目的是不讓當(dāng)前線程獨(dú)自霸占該進(jìn)程所獲的CPU資源,以留一定時間給其他線程執(zhí)行的機(jī)會。
你可以讓程序休眠一毫秒的時間或者到您的計(jì)算機(jī)的壽命長的任意段時間。例如,下面的程序會休眠3秒:
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Thu Sep 17 10:20:30 CST 2015 Thu Sep 17 10:20:33 CST 2015
下面的一個例子表明如何測量時間間隔(以毫秒為單位):
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Fri Jan 08 09:48:47 CST 2016 Fri Jan 08 09:48:50 CST 2016 Difference is : 3019
我們現(xiàn)在已經(jīng)能夠格式化并創(chuàng)建一個日期對象了,但是我們?nèi)绾尾拍茉O(shè)置和獲取日期數(shù)據(jù)的特定部分呢,比如說小時,日,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar 類。
Calendar類的功能要比Date類強(qiáng)大很多,而且在實(shí)現(xiàn)方式上也比Date類要復(fù)雜一些。
Calendar類是一個抽象類,在實(shí)際使用時實(shí)現(xiàn)特定的子類的對象,創(chuàng)建對象的過程對程序員來說是透明的,只需要使用getInstance方法創(chuàng)建即可。
Calendar c = Calendar.getInstance();//默認(rèn)是當(dāng)前日期
使用Calendar類代表特定的時間,需要首先創(chuàng)建一個Calendar的對象,然后再設(shè)定該對象中的年月日參數(shù)來完成。
//創(chuàng)建一個代表2009年6月12日的Calendar對象 Calendar c1 = Calendar.getInstance(); c1.set(2009, 6 - 1, 12);
Calendar類中用以下這些常量表示不同的意義,jdk內(nèi)的很多類其實(shí)都是采用的這種思想
常量 | 描述 |
---|---|
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,和上面的字段意義完全相同 |
Calendar.HOUR | 12小時制的小時 |
Calendar.HOUR_OF_DAY | 24小時制的小時 |
Calendar.MINUTE | 分鐘 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期幾 |
Set設(shè)置
如:
Calendar c1 = Calendar.getInstance();
調(diào)用:
public final void set(int year,int month,int date)
c1.set(2009, 6, 12);//把Calendar對象c1的年月日分別設(shè)這為:2009、6、12
利用字段類型設(shè)置
如果只設(shè)定某個字段,例如日期的值,則可以使用如下set方法:
public void set(int field,int value)
把 c1對象代表的日期設(shè)置為10號,其它所有的數(shù)值會被重新計(jì)算
c1.set(Calendar.DATE,10);
把c1對象代表的年份設(shè)置為2008年,其他的所有數(shù)值會被重新計(jì)算
c1.set(Calendar.YEAR,2008);
其他字段屬性set的意義以此類推
Add設(shè)置
Calendar c1 = Calendar.getInstance();
把c1對象的日期加上10,也就是c1也就表示為10天后的日期,其它所有的數(shù)值會被重新計(jì)算
c1.add(Calendar.DATE, 10);
把c1對象的日期減去10,也就是c1也就表示為10天前的日期,其它所有的數(shù)值會被重新計(jì)算
c1.add(Calendar.DATE, -10);
其他字段屬性的add的意義以此類推
Calendar類實(shí)現(xiàn)了公歷日歷,GregorianCalendar是Calendar類的一個具體實(shí)現(xiàn)。
Calendar 的getInstance()方法返回一個默認(rèn)用當(dāng)前的語言環(huán)境和時區(qū)初始化的GregorianCalendar對象。GregorianCalendar定義了兩個字段:AD和BC。這是代表公歷定義的兩個時代。
下面列出GregorianCalendar對象的幾個構(gòu)造方法:
序號 | 構(gòu)造函數(shù)和說明 |
1 |
GregorianCalendar() 在具有默認(rèn)語言環(huán)境的默認(rèn)時區(qū)內(nèi)使用當(dāng)前時間構(gòu)造一個默認(rèn)的 GregorianCalendar。 |
2 |
GregorianCalendar(int year, int month, int date) 在具有默認(rèn)語言環(huán)境的默認(rèn)時區(qū)內(nèi)構(gòu)造一個帶有給定日期設(shè)置的 GregorianCalendar |
3 |
GregorianCalendar(int year, int month, int date, int hour, int minute) 為具有默認(rèn)語言環(huán)境的默認(rèn)時區(qū)構(gòu)造一個具有給定日期和時間設(shè)置的 GregorianCalendar。 |
4 |
GregorianCalendar(int year, int month, int date, int hour, int minute, int second) ? 為具有默認(rèn)語言環(huán)境的默認(rèn)時區(qū)構(gòu)造一個具有給定日期和時間設(shè)置的 GregorianCalendar。 |
5 |
GregorianCalendar(Locale aLocale) 在具有給定語言環(huán)境的默認(rèn)時區(qū)內(nèi)構(gòu)造一個基于當(dāng)前時間的 GregorianCalendar。 |
6 |
GregorianCalendar(TimeZone zone) 在具有默認(rèn)語言環(huán)境的給定時區(qū)內(nèi)構(gòu)造一個基于當(dāng)前時間的 GregorianCalendar。 |
7 |
GregorianCalendar(TimeZone zone, Locale aLocale) ?在具有給定語言環(huán)境的給定時區(qū)內(nèi)構(gòu)造一個基于當(dāng)前時間的 GregorianCalendar。 |
這里是GregorianCalendar 類提供的一些有用的方法列表:
序號 | 方法和說明 |
1 |
void add(int field, int amount) 根據(jù)日歷規(guī)則,將指定的(有符號的)時間量添加到給定的日歷字段中。 |
2 |
protected void computeFields() 轉(zhuǎn)換UTC毫秒值為時間域值 |
3 |
protected void computeTime() 覆蓋Calendar ,轉(zhuǎn)換時間域值為UTC毫秒值 |
4 |
boolean equals(Object obj) 比較此 GregorianCalendar 與指定的 Object。 |
5 |
int get(int field) 獲取指定字段的時間值 |
6 |
int getActualMaximum(int field) 返回當(dāng)前日期,給定字段的最大值 |
7 |
int getActualMinimum(int field) 返回當(dāng)前日期,給定字段的最小值 |
8 |
int getGreatestMinimum(int field) ?返回此 GregorianCalendar 實(shí)例給定日歷字段的最高的最小值。 |
9 |
Date getGregorianChange() 獲得格里高利歷的更改日期。 |
10 |
int getLeastMaximum(int field) 返回此 GregorianCalendar 實(shí)例給定日歷字段的最低的最大值 |
11 |
int getMaximum(int field) 返回此 GregorianCalendar 實(shí)例的給定日歷字段的最大值。 |
12 |
Date getTime() 獲取日歷當(dāng)前時間。 |
13 |
long getTimeInMillis() 獲取用長整型表示的日歷的當(dāng)前時間 |
14 |
TimeZone getTimeZone() 獲取時區(qū)。 |
15 |
int getMinimum(int field) 返回給定字段的最小值。 |
16 |
int hashCode() 重寫hashCode. |
17 |
boolean isLeapYear(int year) 確定給定的年份是否為閏年。 |
18 |
void roll(int field, boolean up) 在給定的時間字段上添加或減去(上/下)單個時間單元,不更改更大的字段。 |
19 |
void set(int field, int value) 用給定的值設(shè)置時間字段。 |
20 |
void set(int year, int month, int date) 設(shè)置年、月、日的值。 |
21 |
void set(int year, int month, int date, int hour, int minute) 設(shè)置年、月、日、小時、分鐘的值。 |
22 |
void set(int year, int month, int date, int hour, int minute, int second) 設(shè)置年、月、日、小時、分鐘、秒的值。 |
23 |
void setGregorianChange(Date date) 設(shè)置 GregorianCalendar 的更改日期。 |
24 |
void setTime(Date date) 用給定的日期設(shè)置Calendar的當(dāng)前時間。 |
25 |
void setTimeInMillis(long millis) 用給定的long型毫秒數(shù)設(shè)置Calendar的當(dāng)前時間。 |
26 |
void setTimeZone(TimeZone value) 用給定時區(qū)值設(shè)置當(dāng)前時區(qū)。 |
27 |
String toString() 返回代表日歷的字符串。 |
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Date: Apr 22 2009 Time: 11:25:27 當(dāng)前年份不是閏年
關(guān)于 Calender 類的完整列表,你可以參考標(biāo)準(zhǔn)的 Java文檔。