Java 日期時間
java.util套件提供了Date類別來封裝目前的日期和時間。 Date類別提供兩個建構子來實例化Date物件。
第一個建構函式使用目前日期和時間來初始化物件。
Date( )
第二個建構子接收一個參數,該參數是從1970年1月1日起的毫秒數。
Date(long millisec)
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表示形式,並傳回該字串。 |
取得目前日期時間
Java中取得目前日期和時間很簡單,使用Date物件的toString()方法列印目前日期和時間,如下所示:
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 使用 toString() 函数显示日期时间 System.out.println(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允許你選擇任何使用者自訂日期時間格式來運行。例如:
import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { Date dNow = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz"); System.out.println("Current Date: " + ft.format(dNow)); } }
以上實例編譯執行結果如下:
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
簡單的DateFormat格式化編碼
#時間模式字串用來指定時間格式。在此模式中,所有的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開頭並且以下面表格中的一個字母結尾。例如:
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 使用toString()显示日期和时间 String str = String.format("Current Date/Time : %tc", date ); System.out.printf(str); } }
以上實例編譯運行結果如下:
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
如果你需要重複提供日期,那麼利用這種方式來格式化它的每一部分就有點複雜了。因此,可以利用一個格式化字串指出要被格式化的參數的索引。
索引必須緊接在%後面,而且必須以$結束。例如:
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 使用toString()显示日期和时间 System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date); } }
以上實例編譯運行結果如下:
Due date: February 09, 2004
或者,你可以使用<標誌。它表示先前被格式化的參數要再次使用。例如:
import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 显示格式化时间 System.out.printf("%s %tB %<te, %<tY", "Due date:", date); } }
以上實例編譯執行結果如下:
Due date: February 09, 2004
日期和時間轉換字元
字元 | ##描述說明 | 範例 |
c | 完整的日期和時間 | Mon May 04 09:51:52 CDT 2009 |
F | ISO 8601 格式日期 | 2004-02-09 |
D | U.S. 格式日期 (月/日/年) | 02/09/2004 |
T | 24小時時間 | 18:05:19 |
r | 12小時時間 | 06:05:19 pm |
R | 24小時時間,不含秒 | 18:05 |
Y | 4位數年份(含前導0) | 2004 |
y | 年後2位(含前導0) | 04 |
C | 年前2位(含前導0) | 20 |
B | 月份全名 | February |
b | 月份簡稱 | Feb |
n | 2位元月份(含前導0) | 02 |
d | 2位數日子(含前導0) | 03 |
e | 2位數日子(不含前導0) | 9 |
A | 星期全名 | Monday |
a | 星期簡稱 | Mon |
j | 3位數年份(含前導0) | 069 |
H | 2位元小時(含前導0), 00 到 23 | 18 |
k | 2位元小時(不含前導0), 0 至 23 | 18 |
I | 2位元小時(含前導0), 01 到 12 | 06 |
l | 2位元小時(不含前導0), 1 至 12 | 6 |
M | 2位數分鐘(含前導0) | 05 |
S | 2位元秒數(含前導0) | 19 |
L | 3位元毫秒(含前導0) | 047 |
N | 9位元奈秒(含前導0) | 047000000 |
P | 大寫上下午標誌 | PM |
p | 小寫上下午標誌 | pm |
z | 從GMT的RFC 822數位偏移 | -0800 |
Z | 時區 | PST |
s | 自 1970-01-01 00:00:00 GMT的秒數 | 1078884319 |
Q | 自 1970-01-01 00:00:00 GMT的毫妙 | 1078884319047 |
還有其他有用的日期和時間相關的類別。對於更多的細節,你可以參考到Java標準文件。
解析字串為時間
SimpleDateFormat 類別有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat 物件的格式化儲存來解析字串。例如:
import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); String input = args.length == 0 ? "1818-11-11" : args[0]; System.out.print(input + " Parses as "); Date t; try { t = ft.parse(input); System.out.println(t); } catch (ParseException e) { System.out.println("Unparseable using " + ft); } } }
以上實例編譯運行結果如下:
$ 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秒:
import java.util.*; public class SleepDemo { public static void main(String args[]) { try { System.out.println(new Date( ) + "\n"); Thread.sleep(1000*3); // 休眠3秒 System.out.println(new Date( ) + "\n"); } catch (Exception e) { System.out.println("Got an exception!"); } } }
#以上實例編譯運行結果如下:
Thu Sep 17 10:20:30 CST 2015 Thu Sep 17 10:20:33 CST 2015
。 | |
Calendar類別 | 我們現在已經能夠格式化並創建一個日期物件了,但是我們如何才能設定和獲取日期資料的特定部分呢,比如說小時,日,或者分鐘?我們又如何在日期的這些部分加上或減去價值呢? 答案是使用Calendar 類別。 |
Calendar類別是一個抽象類,在實際使用時實作特定的子類別的對象,而建立物件的過程對程式設計師來說是透明的,只需要使用getInstance方法建立。 | 建立一個代表系統目前日期的Calendar物件 |
使用Calendar類別代表特定的時間,需要先建立一個Calendar的對象,然後再設定該物件中的年月日參數來完成。 | //创建一个代表2009年6月12日的Calendar对象 Calendar c1 = Calendar.getInstance(); c1.set(2009, 6 - 1, 12); | Calendar類別物件欄位類型
Calendar類別物件資訊的設定
Set設定
#如:
Calendar c1 = Calendar.getInstance();
呼叫:
public final void set(int year,int month,int date)
c1.set(2009, 6 - 1, 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天前的日期,其它所有的數值會被重新計算
<pre>c1.add(Calendar.DATE, -10);
其他字段屬性的add的意義以此類推
Calendar類別物件資訊的取得
Calendar c1 = Calendar.getInstance(); // 获得年份 int year = c1.get(Calendar.YEAR); // 获得月份 int month = c1.get(Calendar.MONTH) + 1; // 获得日期 int date = c1.get(Calendar.DATE); // 获得小时 int hour = c1.get(Calendar.HOUR_OF_DAY); // 获得分钟 int minute = c1.get(Calendar.MINUTE); // 获得秒 int second = c1.get(Calendar.SECOND); // 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推) int day = c1.get(Calendar.DAY_OF_WEEK);
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) 傳回給定欄位的最小值。 |
& |