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