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