java.util包提供了Date類來封裝當(dāng)前的日期和時(shí)間。 Date類提供兩個(gè)構(gòu)造函數(shù)來實(shí)例化Date對象。
第一個(gè)構(gòu)造函數(shù)使用當(dāng)前日期和時(shí)間來初始化對象。
Date( )
第二個(gè)構(gòu)造函數(shù)接收一個(gè)參數(shù),該參數(shù)是從1970年1月1日起的毫秒數(shù)。
Date(long millisec)
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對象和指定日期。兩者相等時(shí)候返回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對象和指定日期相等時(shí)候返回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è)置時(shí)間和日期。 |
10 | String toString( )
轉(zhuǎn)換Date對象為String表示形式,并返回該字符串。 |
Java中獲取當(dāng)前日期和時(shí)間很簡單,使用Date對象的 toString()方法來打印當(dāng)前日期和時(shí)間,如下所示:
import java.util.Date;
public class Main{
public static void main(String args[]) {
// 初始化 Date 對象
Date date = new Date();
// 使用 toString() 函數(shù)顯示日期時(shí)間
System.out.println(date.toString());
}
}
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Mon May 04 09:51:52 CDT 2013
Java使用以下三種方法來比較兩個(gè)日期:
SimpleDateFormat是一個(gè)以語言環(huán)境敏感的方式來格式化和分析日期的類。SimpleDateFormat允許你選擇任何用戶自定義日期時(shí)間格式來運(yùn)行。例如:
import java.util.*;
import java.text.*;
public class Main{
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));
}
}
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
時(shí)間模式字符串用來指定時(shí)間格式。在此模式中,所有的ASCII字母被保留為模式字母,定義如下:
字母 | 描述 | 示例 |
---|---|---|
G | 紀(jì)元標(biāo)記 | AD |
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一個(gè)月的日期 | 10 |
h | A.M./P.M. (1~12)格式小時(shí) | 12 |
H | 一天中的小時(shí) (0~23) | 22 |
m | 分鐘數(shù) | 30 |
s | 秒數(shù) | 55 |
S | 毫秒數(shù) | 234 |
E | 星期幾 | Tuesday |
D | 一年中的日子 | 360 |
F | 一個(gè)月中第幾周的周幾 | 2 (second Wed. in July) |
w | 一年中第幾周 | 40 |
W | 一個(gè)月中第幾周 | 1 |
a | A.M./P.M. 標(biāo)記 | PM |
k | 一天中的小時(shí)(1~24) | 24 |
K | A.M./P.M. (0~11)格式小時(shí) | 10 |
z | 時(shí)區(qū) | Eastern Standard Time |
' | 文字定界符 | Delimiter |
" | 單引號 | ` |
printf方法可以很輕松地格式化時(shí)間和日期。使用兩個(gè)字母格式,它以t開頭并且以下面表格中的一個(gè)字母結(jié)尾。例如:
import java.util.Date;
public class Main{
public static void main(String args[]) {
// 初始化 Date 對象
Date date = new Date();
// 使用toString()顯示日期和時(shí)間
String str = String.format("Current Date/Time : %tc", date );
System.out.printf(str);
}
}
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
如果你需要重復(fù)提供日期,那么利用這種方式來格式化它的每一部分就有點(diǎn)復(fù)雜了。因此,可以利用一個(gè)格式化字符串指出要被格式化的參數(shù)的索引。
索引必須緊跟在%后面,而且必須以$結(jié)束。例如:
import java.util.Date;
public class Main{
public static void main(String args[]) {
// 初始化 Date 對象
Date date = new Date();
// 使用toString()顯示日期和時(shí)間
System.out.printf("%1$s %2$tB %2$td, %2$tY",
"Due date:", date);
}
}
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Due date: February 09, 2004
或者,你可以使用<標(biāo)志。它表明先前被格式化的參數(shù)要被再次使用。例如:
import java.util.Date;
public class Main{
public static void main(String args[]) {
// 初始化 Date 對象
Date date = new Date();
// 顯示格式化時(shí)間
System.out.printf("%s %tB %<te, %<tY",
"Due date:", date);
}
}
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Due date: February 09, 2004
字符 | 描述 | 例子 |
c | 完整的日期和時(shí)間 | Mon May 04 09:51:52 CDT 2009 |
F | ISO 8601 格式日期 | 2004-02-09 |
D | U.S. 格式日期 (月/日/年) | 02/09/2004 |
T | 24小時(shí)時(shí)間 | 18:05:19 |
r | 12小時(shí)時(shí)間 | 06:05:19 pm |
R | 24小時(shí)時(shí)間,不包含秒 | 18:05 |
Y | 4位年份(包含前導(dǎo)0) | 2004 |
y | 年份后2位(包含前導(dǎo)0) | 04 |
C | 年份前2位(包含前導(dǎo)0) | 20 |
B | 月份全稱 | February |
b | 月份簡稱 | Feb |
n | 2位月份(包含前導(dǎo)0) | 02 |
d | 2位日子(包含前導(dǎo)0) | 03 |
e | 2位日子(不包含前導(dǎo)0) | 9 |
A | 星期全稱 | Monday |
a | 星期簡稱 | Mon |
j | 3位年份(包含前導(dǎo)0) | 069 |
H | 2位小時(shí)(包含前導(dǎo)0), 00 到 23 | 18 |
k | 2位小時(shí)(不包含前導(dǎo)0), 0 到 23 | 18 |
I | 2位小時(shí)(包含前導(dǎo)0), 01 到 12 | 06 |
l | 2位小時(shí)(不包含前導(dǎo)0), 1 到 12 | 6 |
M | 2位分鐘(包含前導(dǎo)0) | 05 |
S | 2位秒數(shù)(包含前導(dǎo)0) | 19 |
L | 3位毫秒(包含前導(dǎo)0) | 047 |
N | 9位納秒(包含前導(dǎo)0) | 047000000 |
P | 大寫上下午標(biāo)志 | PM |
p | 小寫上下午標(biāo)志 | pm |
z | 從GMT的RFC 822數(shù)字偏移 | -0800 |
Z | 時(shí)區(qū) | PST |
s | 自 1970-01-01 00:00:00 GMT的秒數(shù) | 1078884319 |
Q | 自 1970-01-01 00:00:00 GMT的毫妙 | 1078884319047 |
還有其他有用的日期和時(shí)間相關(guān)的類。對于更多的細(xì)節(jié),你可以參考到Java標(biāo)準(zhǔn)文檔。
SimpleDateFormat 類有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat 對象的格式化存儲來解析字符串。例如:
import java.util.*;
import java.text.*;
public class Main{
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);
}
}
}
以上實(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
Java 休眠(sleep)
你可以讓程序休眠一毫秒的時(shí)間或者到您的計(jì)算機(jī)的壽命長的任意段時(shí)間。例如,下面的程序會休眠3秒:
import java.util.*;
public class Main{
public static void main(String args[]) {
try {
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Sun May 03 18:04:41 GMT 2009
Sun May 03 18:04:44 GMT 2009
下面的一個(gè)例子表明如何測量時(shí)間間隔(以毫秒為單位):
import java.util.*;
public class Main{
public static void main(String args[]) {
try {
long start = System.currentTimeMillis( );
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
long end = System.currentTimeMillis( );
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Sun May 03 18:16:51 GMT 2009
Sun May 03 18:16:54 GMT 2009
Difference is : 3050
我們現(xiàn)在已經(jīng)能夠格式化并創(chuàng)建一個(gè)日期對象了,但是我們?nèi)绾尾拍茉O(shè)置和獲取日期數(shù)據(jù)的特定部分呢,比如說小時(shí),日,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar 類。
Calendar類的功能要比Date類強(qiáng)大很多,而且在實(shí)現(xiàn)方式上也比Date類要復(fù)雜一些。
Calendar類是一個(gè)抽象類,在實(shí)際使用時(shí)實(shí)現(xiàn)特定的子類的對象,創(chuàng)建對象的過程對程序員來說是透明的,只需要使用getInstance方法創(chuàng)建即可。
Calendar c = Calendar.getInstance();//默認(rèn)是當(dāng)前日期
使用Calendar類代表特定的時(shí)間,需要首先創(chuàng)建一個(gè)Calendar的對象,然后再設(shè)定該對象中的年月日參數(shù)來完成。
//創(chuàng)建一個(gè)代表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小時(shí)制的小時(shí) |
Calendar.HOUR_OF_DAY | 24小時(shí)制的小時(shí) |
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 - 1, 12);//把Calendar對象c1的年月日分別設(shè)這為:2009、5、12
利用字段類型設(shè)置
如果只設(shè)定某個(gè)字段,例如日期的值,則可以使用如下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 c1 = Calendar.getInstance();
// 獲得年份
int year = c1.get(Calendar.YEAR);
// 獲得月份
int month = c1.get(Calendar.MONTH) + 1;
// 獲得日期
int date = c1.get(Calendar.DATE);
// 獲得小時(shí)
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 獲得分鐘
int minute = c1.get(Calendar.MINUTE);
// 獲得秒
int second = c1.get(Calendar.SECOND);
// 獲得星期幾(注意(這個(gè)與Date類是不同的):1代表星期日、2代表星期1、3代表星期二,以此類推)
int day = c1.get(Calendar.DAY_OF_WEEK);
Calendar類實(shí)現(xiàn)了公歷日歷,GregorianCalendar是Calendar類的一個(gè)具體實(shí)現(xiàn)。
Calendar 的getInstance()方法返回一個(gè)默認(rèn)用當(dāng)前的語言環(huán)境和時(shí)區(qū)初始化的GregorianCalendar對象。GregorianCalendar定義了兩個(gè)字段:AD和BC。這些代表公歷定義的兩個(gè)時(shí)代。
下面列出GregorianCalendar對象的幾個(gè)構(gòu)造方法:
序號 | 構(gòu)造函數(shù)和說明 |
1 | GregorianCalendar()
在具有默認(rèn)語言環(huán)境的默認(rèn)時(shí)區(qū)內(nèi)使用當(dāng)前時(shí)間構(gòu)造一個(gè)默認(rèn)的 GregorianCalendar。 |
2 | GregorianCalendar(int year, int month, int date)
在具有默認(rèn)語言環(huán)境的默認(rèn)時(shí)區(qū)內(nèi)構(gòu)造一個(gè)帶有給定日期設(shè)置的 GregorianCalendar |
3 | GregorianCalendar(int year, int month, int date, int hour, int minute)
為具有默認(rèn)語言環(huán)境的默認(rèn)時(shí)區(qū)構(gòu)造一個(gè)具有給定日期和時(shí)間設(shè)置的 GregorianCalendar。 |
4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
為具有默認(rèn)語言環(huán)境的默認(rèn)時(shí)區(qū)構(gòu)造一個(gè)具有給定日期和時(shí)間設(shè)置的 GregorianCalendar。 |
5 | GregorianCalendar(Locale aLocale)
在具有給定語言環(huán)境的默認(rèn)時(shí)區(qū)內(nèi)構(gòu)造一個(gè)基于當(dāng)前時(shí)間的 GregorianCalendar。 |
6 | GregorianCalendar(TimeZone zone)
在具有默認(rèn)語言環(huán)境的給定時(shí)區(qū)內(nèi)構(gòu)造一個(gè)基于當(dāng)前時(shí)間的 GregorianCalendar。 |
7 | GregorianCalendar(TimeZone zone, Locale aLocale)
在具有給定語言環(huán)境的給定時(shí)區(qū)內(nèi)構(gòu)造一個(gè)基于當(dāng)前時(shí)間的 GregorianCalendar。 |
這里是GregorianCalendar 類提供的一些有用的方法列表:
序號 | 方法和說明 |
1 | void add(int field, int amount)
根據(jù)日歷規(guī)則,將指定的(有符號的)時(shí)間量添加到給定的日歷字段中。 |
2 | protected void computeFields()
轉(zhuǎn)換UTC毫秒值為時(shí)間域值 |
3 | protected void computeTime()
覆蓋Calendar ,轉(zhuǎn)換時(shí)間域值為UTC毫秒值 |
4 | boolean equals(Object obj)
比較此 GregorianCalendar 與指定的 Object。 |
5 | int get(int field)
獲取指定字段的時(shí)間值 |
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)前時(shí)間。 |
13 | long getTimeInMillis()
獲取用長整型表示的日歷的當(dāng)前時(shí)間 |
14 | TimeZone getTimeZone()
獲取時(shí)區(qū)。 |
15 | int getMinimum(int field)
返回給定字段的最小值。 |
16 | int hashCode()
重寫hashCode. |
17 | boolean isLeapYear(int year)
確定給定的年份是否為閏年。 |
18 | void roll(int field, boolean up)
在給定的時(shí)間字段上添加或減去(上/下)單個(gè)時(shí)間單元,不更改更大的字段。 |
19 | void set(int field, int value)
用給定的值設(shè)置時(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è)置年、月、日、小時(shí)、分鐘的值。 |
22 | void set(int year, int month, int date, int hour, int minute, int second)
設(shè)置年、月、日、小時(shí)、分鐘、秒的值。 |
23 | void setGregorianChange(Date date)
設(shè)置 GregorianCalendar 的更改日期。 |
24 | void setTime(Date date)
用給定的日期設(shè)置Calendar的當(dāng)前時(shí)間。 |
25 | void setTimeInMillis(long millis)
用給定的long型毫秒數(shù)設(shè)置Calendar的當(dāng)前時(shí)間。 |
26 | void setTimeZone(TimeZone value)
用給定時(shí)區(qū)值設(shè)置當(dāng)前時(shí)區(qū)。 |
27 | String toString()
返回代表日歷的字符串。 |
import java.util.*;
public class GregorianCalendarDemo {
public static void main(String args[]) {
String months[] = {
"Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"};
int year;
// 初始化 Gregorian 日歷
// 使用當(dāng)前時(shí)間和日期
// 默認(rèn)為本地時(shí)間和時(shí)區(qū)
GregorianCalendar gcalendar = new GregorianCalendar();
// 顯示當(dāng)前時(shí)間和日期的信息
System.out.print("Date: ");
System.out.print(months[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(year = gcalendar.get(Calendar.YEAR));
System.out.print("Time: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));
// 測試當(dāng)前年份是否為閏年
if(gcalendar.isLeapYear(year)) {
System.out.println("當(dāng)前年份是閏年");
}
else {
System.out.println("當(dāng)前年份不是閏年");
}
}
}
以上實(shí)例編譯運(yùn)行結(jié)果如下:
Date: Apr 22 2009
Time: 11:25:27
當(dāng)前年份不是閏年
關(guān)于Calender 類的完整列表,你可以參考標(biāo)準(zhǔn)的Java文檔。
更多建議: