在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以後的值。例如上面的示例代碼代表就是2009年3月9号。
實際代表具體的年月日時分秒的日期對象,和這個類似。
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,後續的依次類推。
4、Date對象和相對時間之間的互轉
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類的對象。經過轉換以後,既友善了時間的計算,也使時間顯示比較直覺了。
從JDK1.1版本開始,在處理日期和時間時,系統推薦使用Calendar類進行實作。在設計上,Calendar類的功能要比Date類強大很多,而且在實作方式上也比Date類要複雜一些,下面就介紹一下Calendar類的使用。
Calendar類是一個抽象類,在實際使用時實作特定的子類的對象,建立對象的過程對程式員來說是透明的,隻需要使用getInstance方法建立即可。
1、使用Calendar類代表目前時間
Calendar c = Calendar.getInstance();
由于Calendar類是抽象類,且Calendar類的構造方法是protected的,是以無法使用Calendar類的構造方法來建立對象,API中提供了getInstance方法用來建立對象。
使用該方法獲得的Calendar對象就代表目前的系統時間,由于Calendar類toString實作的沒有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)
以上示例代碼設定的時間為2009年3月9日,其參數的結構和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);
使用Calendar類中的get方法可以獲得Calendar對象中對應的資訊,get方法的聲明如下:
public int get(int field)
其中參數field代表需要獲得的字段的值,字段說明和上面的set方法保持一緻。需要說明的是,獲得的月份為實際的月份值減1,獲得的星期的值和Date類不一樣。在Calendar類中,周日是1,周一是2,周二是3,依次類推。
4、其它方法說明
其實Calendar類中還提供了很多其它有用的方法,下面簡單的介紹幾個常見方法的使用。
a、add方法
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天以後的日期,例如程式的輸出結果可能為:
2009年6月17日
b、after方法
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代表的時間是2009年10月10号,對象c5代表的時間是2010年10月10号,則對象c5代表的日期在c4代表的日期之後,是以after方法的傳回值是true。
另外一個類似的方法是before,該方法是判斷目前日期對象是否位于另外一個日期對象之前。
c、getTime方法
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);
5、Calendar對象和相對時間之間的互轉
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、計算兩個日期之間相差的天數
例如計算2010年4月1号和2009年3月11号之間相差的天數,則可以使用時間和日期處理進行計算。
該程式實作的原理為:首先代表兩個特定的時間點,這裡使用Calendar的對象進行代表,然後将兩個時間點轉換為對應的相對時間,求兩個時間點相對時間的內插補點,然後除以1天的毫秒數(24小時X60分鐘X60秒X1000毫秒)即可獲得對應的天數。實作該示例的完整代碼如下:
import java.util.*;
/**
* 計算兩個日期之間相差的天數
*/
public class DateExample1 {
public static void main(String[] args) {
//設定兩個日期
//日期:2009年3月11号
c1.set(2009, 3 - 1, 11);
//日期:2010年4月1号
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、輸出目前月的月曆
該示例的功能是輸出目前系統時間所在月的月曆,例如目前系統時間是2009年3月10日,則輸出2009年3月的月曆。
該程式實作的原理為:首先獲得該月1号是星期幾,然後獲得該月的天數,最後使用流程控制實作按照月曆的格式進行輸出即可。即如果1号是星期一,則列印一個機關的空格,如果1号是星期二,則列印兩個機關的空格,依次類推。列印完星期六的日期以後,進行換行。實作該示例的完整代碼如下:
* 輸出目前月的月曆
public class DateExample2{
public static void main(String[] args){
//獲得目前時間
//設定代表的日期為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();
}
關于時間和日期的處理就介紹這麼多,更多的實作方法還需要根據具體問題進行對應的實作