java 日期時間
java.util 包提供了 date 類來封裝當(dāng)前的日期和時間。
java.util 包提供了 calendar 類用來設(shè)置和獲取日期數(shù)據(jù)的特定部分。
另外,還提供了 simpledateformat 類來格式化日期的格式。
1. date 類
1)date 類的創(chuàng)建
date 類提供兩個構(gòu)造函數(shù)來范例化 date 對象。
第一個構(gòu)造函數(shù)使用當(dāng)前日期和時間來初始化對象。
date()
第二個構(gòu)造函數(shù)接收一個參數(shù),該參數(shù)是從1970年1月1日起的毫秒數(shù)。
date(long millisec)
2)date 類的操作
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)。 |
3)獲取當(dāng)前日期時間
java中獲取當(dāng)前日期和時間很簡單,使用 date 對象的 tostring() 方法來打印當(dāng)前日期和時間:
import java.util.date; public class datedemo { public static void main(string args[]) { // 初始化 date 對象 date date = new date(); // 使用 tostring() 函數(shù)顯示日期時間 system.out.println(date.tostring()); } }
以上范例編譯運(yùn)行結(jié)果如下:
mon may 04 09:51:52 cdt 2013
4)日期比較
java使用以下三種方法來比較兩個日期:
- 使用 gettime() 方法獲取兩個日期(自1970年1月1日經(jīng)歷的毫秒數(shù)值),然后比較這兩個值。
- 使用方法 before(),after() 和 equals()。例如,一個月的12號比18號早,則 new date(99, 2, 12).before(new date (99, 2, 18)) 返回true。
- 使用 compareto() 方法,它是由 comparable 接口定義的,date 類實現(xiàn)了這個接口。
2. simpledateformat 類
simpledateformat 是一個以語言環(huán)境敏感的方式來格式化和分析日期的類。simpledateformat 允許你選擇任何用戶自定義日期時間格式來運(yùn)行。
1)simpledateformat 類使用案例
import java.util.*; import java.text.*; public class datedemo { public static void main(string args[]) { date dnow = new date( ); simpledateformat ft = new simpledateformat ("yyyy-mm-dd hh:mm:ss"); system.out.println("當(dāng)前時間為: " + ft.format(dnow)); } }
代碼說明:
simpledateformat ft = new simpledateformat ("yyyy-mm-dd hh:mm:ss");
這一行代碼確立了轉(zhuǎn)換的格式,其中 yyyy 是完整的公元年,mm 是月份,dd 是日期,hh:mm:ss 是時、分、秒。
注意:有的格式大寫,有的格式小寫,例如 mm 是月份,mm 是分;hh 是 24 小時制,而 hh 是 12 小時制。
以上范例編譯運(yùn)行結(jié)果如下:
當(dāng)前時間為: 2018-09-06 10:16:34
2)日期和時間的格式化編碼
時間模式字符串用來指定時間格式。在此模式中,所有的 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 |
" | 單引號 | ` |
3)解析字符串為時間
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); } } }
以上范例編譯運(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
3. calendar類
我們現(xiàn)在已經(jīng)能夠格式化并創(chuàng)建一個日期對象了,但是我們?nèi)绾尾拍茉O(shè)置和獲取日期數(shù)據(jù)的特定部分呢,比如說小時,日,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用calendar 類。
calendar類的功能要比date類強(qiáng)大很多,而且在實現(xiàn)方式上也比date類要復(fù)雜一些。
calendar類是一個抽象類,在實際使用時實現(xiàn)特定的子類的對象,創(chuàng)建對象的過程對程序員來說是透明的,只需要使用getinstance方法創(chuàng)建即可。
1)創(chuàng)建一個代表系統(tǒng)當(dāng)前日期的calendar對象
calendar c = calendar.getinstance();//默認(rèn)是當(dāng)前日期
2)創(chuàng)建一個指定日期的calendar對象
使用calendar類代表特定的時間,需要首先創(chuàng)建一個calendar的對象,然后再設(shè)定該對象中的年月日參數(shù)來完成。
//創(chuàng)建一個代表2009年6月12日的calendar對象 calendar c1 = calendar.getinstance(); c1.set(2009, 6 - 1, 12);
3)calendar類對象字段類型
calendar類中用以下這些常量表示不同的意義,jdk內(nèi)的很多類其實都是采用的這種思想
常量 | 描述 |
---|---|
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 | 星期幾 |
4)calendar類對象信息的設(shè)置
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ù)值會被重新計算
c1.set(calendar.date,10);
把c1對象代表的年份設(shè)置為2008年,其他的所有數(shù)值會被重新計算
c1.set(calendar.year,2008);
其他字段屬性set的意義以此類推
add設(shè)置
calendar c1 = calendar.getinstance();
把c1對象的日期加上10,也就是c1也就表示為10天后的日期,其它所有的數(shù)值會被重新計算
c1.add(calendar.date, 10);
把c1對象的日期減去10,也就是c1也就表示為10天前的日期,其它所有的數(shù)值會被重新計算
c1.add(calendar.date, -10);
其他字段屬性的add的意義以此類推
5)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);