java date類型和calendar類型區別

Date

JDK1.0中,Date類是唯一的一個代表時間的類,但是由於Date類不便於實現國際化,所以從JDK1.1版本開始,推薦使用Calendar類進行時間和日期處理。這裏簡單介紹一下Date類的使用。

1、使用Date類代表當前系統時間

Date d = new Date();

System.out.println(d);

使用Date類的默認構造方法創建出的對象就代表當前時間,由於Date類覆蓋了toString方法,所以可以直接輸出Date類型的對象,顯示的結果如下:

Sun Mar 08 16:35:58 CST 2009

在該格式中,Sun代表Sunday(週日)Mar代表March(三月)08代表8號,CST代表China Standard Time(中國標準時間,也就是北京時間(東八區))

2、使用Date類代表指定的時間

Date d1 = new Date(2009-1900,3-1,9);

System.out.println(d1);

使用帶參數的構造方法,可以構造指定日期的Date類對象,Date類中年份的參數應該是實際需要代表的年份減去1900,實際需要代表的月份減去1以後的值。例如上面的示例代碼代表就是200939號。

實際代表具體的年月日時分秒的日期對象,和這個類似。

3、獲得Date對象中的信息

Date d2 = new Date();

//年份

int year = d2.getYear() + 1900;

//月份

int month = d2.getMonth() + 1;

//日期

int date = d2.getDate();

//小時

int hour = d2.getHours();

//分鐘

int minute = d2.getMinutes();

//

int second = d2.getSeconds();

//星期幾

int day = d2.getDay();

System.out.println("年份:" + year);

System.out.println("月份:" + month);

System.out.println("日期:" + date);

System.out.println("小時:" + hour);

System.out.println("分鐘:" + minute);

System.out.println("秒:" + second);

System.out.println("星期:" + day);

使用Date類中對應的get方法,可以獲得Date類對象中相關的信息,需要注意的是使用getYear獲得是Date對象中年份減去1900以後的值,所以需要顯示對應的年份則需要在返回值的基礎上加上1900,月份類似。在Date類中還提供了getDay方法,用於獲得Date對象代表的時間是星期幾,Date類規定週日是0,週一是1,週二是2,後續的依次類推。

4Date對象和相對時間之間的互轉

Date d3 = new Date(2009-1900,3-1,10);

long time = 1290876532190L;

//Date類的對象轉換爲相對時間

long t = d3.getTime();

System.out.println(t);

//將相對時間轉換爲Date類的對象

Date d4 = new Date(time);

System.out.println(d4);

使用Date對象中的getTime方法,可以將Date類的對象轉換爲相對時間,使用Date類的構造方法,可以將相對時間轉換爲Date類的對象。經過轉換以後,既方便了時間的計算,也使時間顯示比較直觀了。

Calendar

JDK1.1版本開始,在處理日期和時間時,系統推薦使用Calendar類進行實現。在設計上,Calendar類的功能要比Date類強大很多,而且在實現方式上也比Date類要複雜一些,下面就介紹一下Calendar類的使用。

Calendar類是一個抽象類,在實際使用時實現特定的子類的對象,創建對象的過程對程序員來說是透明的,只需要使用getInstance方法創建即可。

1、使用Calendar類代表當前時間

Calendar c = Calendar.getInstance();

由於Calendar類是抽象類,且Calendar類的構造方法是protected的,所以無法使用Calendar類的構造方法來創建對象,API中提供了getInstance方法用來創建對象。

使用該方法獲得的Calendar對象就代表當前的系統時間,由於CalendartoString實現的沒有Date類那麼直觀,所以直接輸出Calendar類的對象意義不大。

2、使用Calendar類代表指定的時間

Calendar c1 = Calendar.getInstance();

c1.set(2009, 3 - 1, 9);

使用Calendar類代表特定的時間,需要首先創建一個Calendar的對象,然後再設定該對象中的年月日參數來完成。

set方法的聲明爲:

public final void set(int year,int month,int date)

以上示例代碼設置的時間爲200939日,其參數的結構和Date類不一樣。Calendar類中年份的數值直接書寫,月份的值爲實際的月份值減1,日期的值就是實際的日期值。

如果只設定某個字段,例如日期的值,則可以使用如下set方法:

public void set(int field,int value)

在該方法中,參數field代表要設置的字段的類型,常見類型如下:

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——星期幾

後續的參數value代表,設置成的值。例如:

c1.set(Calendar.DATE,10);

該代碼的作用是將c1對象代表的時間中日期設置爲10號,其它所有的數值會被重新計算,例如星期幾以及對應的相對時間數值等。

3、獲得Calendar類中的信息

Calendar c2 = Calendar.getInstance();

//年份

int year = c2.get(Calendar.YEAR);

//月份

int month = c2.get(Calendar.MONTH) + 1;

//日期

int date = c2.get(Calendar.DATE);

//小時

int hour = c2.get(Calendar.HOUR_OF_DAY);

//分鐘

int minute = c2.get(Calendar.MINUTE);

//

int second = c2.get(Calendar.SECOND);

//星期幾

int day = c2.get(Calendar.DAY_OF_WEEK);

System.out.println("年份:" + year);

System.out.println("月份:" + month);

System.out.println("日期:" + date);

System.out.println("小時:" + hour);

System.out.println("分鐘:" + minute);

System.out.println("秒:" + second);

System.out.println("星期:" + day);

使用Calendar類中的get方法可以獲得Calendar對象中對應的信息,get方法的聲明如下:

public int get(int field)

其中參數field代表需要獲得的字段的值,字段說明和上面的set方法保持一致。需要說明的是,獲得的月份爲實際的月份值減1,獲得的星期的值和Date類不一樣。在Calendar類中,週日是1,週一是2,週二是3,依次類推。

4、其它方法說明

其實Calendar類中還提供了很多其它有用的方法,下面簡單的介紹幾個常見方法的使用。

aadd方法

public abstract void add(int field,int amount)

該方法的作用是在Calendar對象中的某個字段上增加或減少一定的數值,增加是amount的值爲正,減少時amount的值爲負。

例如在計算一下當前時間100天以後的日期,代碼如下:

Calendar c3 = Calendar.getInstance();

c3.add(Calendar.DATE, 100);

int year1 = c3.get(Calendar.YEAR);

//月份

int month1 = c3.get(Calendar.MONTH) + 1;

//日期

int date1 = c3.get(Calendar.DATE);

System.out.println(year1 + "" + month1 + "" + date1 + "");

這裏add方法是指在c3對象的Calendar.DATE,也就是日期字段上增加100,類內部會重新計算該日期對象中其它各字段的值,從而獲得100天以後的日期,例如程序的輸出結果可能爲:

2009617

bafter方法

public boolean after(Object when)

該方法的作用是判斷當前日期對象是否在when對象的後面,如果在when對象的後面則返回true,否則返回false。例如:

Calendar c4 = Calendar.getInstance();

c4.set(2009, 10 - 1, 10);

Calendar c5 = Calendar.getInstance();

c5.set(2010, 10 - 1, 10);

boolean b = c5.after(c4);

System.out.println(b);

在該示例代碼中對象c4代表的時間是20091010號,對象c5代表的時間是20101010號,則對象c5代表的日期在c4代表的日期之後,所以after方法的返回值是true

另外一個類似的方法是before,該方法是判斷當前日期對象是否位於另外一個日期對象之前。

cgetTime方法

public final Date getTime()

該方法的作用是將Calendar類型的對象轉換爲對應的Date類對象,兩者代表相同的時間點。

類似的方法是setTime,該方法的作用是將Date對象轉換爲對應的Calendar對象,該方法的聲明如下:

public final void setTime(Date date)

轉換的示例代碼如下:

Date d = new Date();

Calendar c6 = Calendar.getInstance();

//Calendar類型的對象轉換爲Date對象

Date d1 = c6.getTime();

//Date類型的對象轉換爲Calendar對象

Calendar c7 = Calendar.getInstance();

c7.setTime(d);

5Calendar對象和相對時間之間的互轉

Calendar c8 = Calendar.getInstance();

long t = 1252785271098L;

//Calendar對象轉換爲相對時間

long t1 = c8.getTimeInMillis();

//將相對時間轉換爲Calendar對象

Calendar c9 = Calendar.getInstance();

c9.setTimeInMillis(t1);

在轉換時,使用Calendar類中的getTimeInMillis方法可以將Calendar對象轉換爲相對時間。在將相對時間轉換爲Calendar對象時,首先創建一個Calendar對象,然後再使用Calendar類的setTimeInMillis方法設置時間即可。

應用示例

下面以兩個簡單的示例介紹時間和日期處理的基本使用。

1、計算兩個日期之間相差的天數

例如計算201041號和2009311號之間相差的天數,則可以使用時間和日期處理進行計算。

該程序實現的原理爲:首先代表兩個特定的時間點,這裏使用Calendar的對象進行代表,然後將兩個時間點轉換爲對應的相對時間,求兩個時間點相對時間的差值,然後除以1天的毫秒數(24小時X60分鐘X60X1000毫秒)即可獲得對應的天數。實現該示例的完整代碼如下:

import java.util.*;

/**

* 計算兩個日期之間相差的天數

*/

public class DateExample1 {

public static void main(String[] args) {

//設置兩個日期

//日期:2009311

Calendar c1 = Calendar.getInstance();

c1.set(2009, 3 - 1, 11);

//日期:201041

Calendar c2 = Calendar.getInstance();

c2.set(2010, 4 - 1, 1);

//轉換爲相對時間

long t1 = c1.getTimeInMillis();

long t2 = c2.getTimeInMillis();

//計算天數

long days = (t2 - t1)/(24 * 60 * 60 * 1000);

System.out.println(days);

}

}

2、輸出當前月的月曆

該示例的功能是輸出當前系統時間所在月的日曆,例如當前系統時間是2009310日,則輸出20093月的日曆。

該程序實現的原理爲:首先獲得該月1號是星期幾,然後獲得該月的天數,最後使用流程控制實現按照日曆的格式進行輸出即可。即如果1號是星期一,則打印一個單位的空格,如果1號是星期二,則打印兩個單位的空格,依次類推。打印完星期六的日期以後,進行換行。實現該示例的完整代碼如下:

import java.util.*;

/**

* 輸出當前月的日曆

*/

public class DateExample2{

public static void main(String[] args){

//獲得當前時間

Calendar c = Calendar.getInstance();

//設置代表的日期爲1

c.set(Calendar.DATE,1);

//獲得1號是星期幾

int start = c.get(Calendar.DAY_OF_WEEK);

//獲得當前月的最大日期數

int maxDay = c.getActualMaximum(Calendar.DATE);

//輸出標題

System.out.println("星期日 星期一 星期二 星期三 星期四 星期五 星期六");

//輸出開始的空格

for(int i = 1;i < start;i++){

System.out.print(" ");

}

//輸出該月中的所有日期

for(int i = 1;i <= maxDay;i++){

//輸出日期數字

System.out.print(" " + i);

//輸出分隔空格

System.out.print(" ");

if(i < 10){

System.out.print(' ');

}

//判斷是否換行

if((start + i - 1) % 7 == 0){

System.out.println();

}

}

//換行

System.out.println();

}

}

關於時間和日期的處理就介紹這麼多,更多的實現方法還需要根據具體問題進行對應的實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章