JAVA 日期比較、計算

import java.text.DecimalFormat;
//import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * 類描述:自己實現的日期計算類,可以自由擴展
 * @author xieyh [email protected]
 * @version  build 2005-3-18
 *
 */
public class DateCalculate {
   
    /** 注意格里曆和儒略曆交接時的日期差別 */
    private static transient int gregorianCutoverYear = 1582;
   
    /** 閏年中每月天數 */
    private static final int[] DAYS_P_MONTH_LY=
      {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    /** 平年中每月天數 */
    private static final int[] DAYS_P_MONTH_CY=
   {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    /** 代表數組裏的年、月、日 */
    private static final int Y = 0, M = 1, D = 2;
   
    /** 參與運算用 */
    private int[] ymd = null;

    /**
     * 檢查傳入的參數是否合法的日期
     * @param date
     * @throws IllegalArgumentException
     */
    public static void validate(String date)throws IllegalArgumentException{
       
        int[] ymd = splitYMD( date );
       
        if( ymd[M] == 0 || ymd[M] > 12 ){
            throw new IllegalArgumentException("月份數值錯誤");
        }
       
        if( true == isLeapYear( ymd[0] ) ){
            if( ymd[D] == 0 || ymd[D] > DAYS_P_MONTH_LY[ymd[M] -1 ] ){
                throw new IllegalArgumentException("日期數值錯誤");
            }
        }else{
            if( ymd[D] == 0 || ymd[D] > DAYS_P_MONTH_CY[ymd[M] -1 ] ){
                throw new IllegalArgumentException("日期數值錯誤");
            }
        }
    }

    /**
     * 檢查傳入的參數代表的年份是否爲閏年
     * @param year
     * @return
     */
    public static boolean isLeapYear(int year) {
        return year >= gregorianCutoverYear ?
            ((year%4 == 0) && ((year%100 != 0) ||
                    (year%400 == 0))) : // Gregorian
            (year%4 == 0); // Julian
    }
   
    /**
     * 日期加1天,注意這裏沒有考慮儒略曆和格里曆交接時相差的10天
     * @param year
     * @param month
     * @param day
     * @return
     */
    private int[] addOneDay(int year, int month, int day){
        if(isLeapYear( year )){
            day++;
            if( day > DAYS_P_MONTH_LY[month -1 ] ){
                month++;
                if(month > 12){
                    year++;
                    month = 1;
                }
                day = 1;
            }
        }else{
            day++;
            if( day > DAYS_P_MONTH_CY[month -1 ] ){
                month++;
                if(month > 12){
                    year++;
                    month = 1;
                }
                day = 1;
            }
        }
        int[] ymd = {year, month, day};
        return ymd;
    }
   
    /**
     * 以循環的方式計算日期加法
     * @param date
     * @param days
     * @return
     */
    public String addDaysByLoop(String date, int days){
        validate(date);
        int[] ymd = splitYMD( date );
        for(int i = 0; i < days; i++){
            ymd = addOneDay(ymd[Y], ymd[M], ymd[D]);
        }
        return formatYear(ymd[Y])+
       formatMonthDay(ymd[M])+
       formatMonthDay(ymd[D]);
    }
   
    /**
     * 日期減1天,注意這裏沒有考慮儒略曆和格里曆交接時相差的10天
     * @param year
     * @param month
     * @param day
     * @return
     */
    private int[] reduceOneDay(int year, int month, int day){
        if(isLeapYear( year )){
            day--;
            if( day <= 0 ){
                month--;
                if(month < 1){
                    year--;
                    month = 12;
                }
                day = DAYS_P_MONTH_LY[month -1 ];
            }
        }else{
            day--;
            if( day <= 0 ){
                month--;
                if(month < 1){
                    year--;
                    month = 12;
                }
                day = DAYS_P_MONTH_CY[month -1 ];
            }
        }
        int[] ymd = {year, month, day};
        return ymd;
    }
   
    /**
     * 以循環的方式計算日期減法
     * @param date
     * @param days
     * @return
     */
    public String reduceDaysByLoop(String date, int days){
        validate(date);
        int[] ymd = splitYMD( date );
        for(int i = 0; i < days; i++){
            ymd = reduceOneDay(ymd[Y], ymd[M], ymd[D]);
        }
        return formatYear(ymd[Y])+
       formatMonthDay(ymd[M])+
       formatMonthDay(ymd[D]);
    }
   
    /**
     * 指定日期加上指定的天數的操作
     * @param date
     * @param days
     * @return
     * @throws IllegalArgumentException
     */
    public String addDays(Date date, int days)
     throws IllegalArgumentException{
        return addDays(formatDate(date), days);
    }
   
    /**
     * 指定日期加上指定的天數的操作
     * @param date
     * @param days
     * @return
     * @throws IllegalArgumentException
     */
    public String addDays(String date, int days)
     throws IllegalArgumentException{
       
        validate(date);
        ymd = splitYMD( date );
       
        if( isLeapYear( ymd[Y] ) ){
            ymd[D] += days;
            if( ymd[D] > DAYS_P_MONTH_LY[ymd[M] -1 ] ){
                ymd[M] ++;
                ymd[D] = ymd[D] - DAYS_P_MONTH_LY[ymd[M] -1-1 ];
                if(ymd[M] > 12){
                    ymd[M] -= 12;
                    ymd[Y]++;
                }
                if( ymd[D] > DAYS_P_MONTH_LY[ymd[M] -1 ] ){
                    addDays(formatYear(ymd[Y])+
                         formatMonthDay(ymd[M])+
                         formatMonthDay(DAYS_P_MONTH_LY[ymd[M] -1 ]),
                         ymd[D] - DAYS_P_MONTH_LY[ymd[M] -1 ]);
                }
            }
        }else{
            ymd[D] += days;
            if( ymd[D] > DAYS_P_MONTH_CY[ymd[M] -1 ] ){
                ymd[M] ++;
                ymd[D] = ymd[D] - DAYS_P_MONTH_CY[ymd[M] -1-1 ];
                if(ymd[M] > 12){
                    ymd[M] -= 12;
                    ymd[Y]++;
                }
                if( ymd[D] > DAYS_P_MONTH_CY[ymd[M] -1 ] ){
                    addDays(formatYear(ymd[Y])+
                         formatMonthDay(ymd[M])+
                         formatMonthDay(DAYS_P_MONTH_CY[ymd[M] -1 ]),
                         ymd[D] - DAYS_P_MONTH_CY[ymd[M] -1 ]);
                }
            }
        }
        return  formatYear(ymd[Y])+
        formatMonthDay(ymd[M])+
        formatMonthDay(ymd[D]);
    }
   
    /**
     * 指定日期減去指定的天數的操作
     * @param date
     * @param days
     * @return
     * @throws IllegalArgumentException
     */
    public String reduceDays(Date date, int days)
     throws IllegalArgumentException{
        return reduceDays(formatDate(date), days);
    }
   
    /**
     * 指定日期減去指定的天數的操作
     * @param date
     * @param days
     * @return
     * @throws IllegalArgumentException
     */
    public String reduceDays(String date, int days)
     throws IllegalArgumentException{
       
        validate(date);
        ymd = splitYMD( date );
       
        if( isLeapYear( ymd[Y] ) ){
            ymd[D] -= days;
            if( ymd[D] <= 0 ){
                ymd[M] --;
                if(ymd[M] < 1){
                    ymd[M] += 12;
                    ymd[Y]--;
                }
                ymd[D] = ymd[D] + DAYS_P_MONTH_LY[ ymd[M]-1 ];
                if( ymd[D] <= 0 ){
                    reduceDays(formatYear(ymd[Y])+
                         formatMonthDay(ymd[M])+
                         formatMonthDay( 1 ),
                         abs( ymd[D] - 1 ));
                }
            }
        }else{
            ymd[D] -= days;
            if( ymd[D] <= 0 ){
                ymd[M] --;
                if(ymd[M] < 1){
                    ymd[M] += 12;
                    ymd[Y]--;
                }
                ymd[D] = ymd[D] + DAYS_P_MONTH_CY[ ymd[M]-1 ];
                if( ymd[D] <= 0 ){
                    reduceDays(formatYear(ymd[Y])+
                         formatMonthDay(ymd[M])+
                         formatMonthDay(1),
                         abs( ymd[D] - 1 ));
                }
            }
        }
        return  formatYear(ymd[Y])+
        formatMonthDay(ymd[M])+
        formatMonthDay(ymd[D]);
    }
   
    /**
     * 格式化一個日期字符串
     * @param date
     * @return
     */
    public static String formatDate(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format( date );
    }
   
    /**
     * 將代表日期的字符串分割爲代表年月日的整形數組
     * @param date
     * @return
     */
    public static int[] splitYMD(String date){
        int[] ymd = {0, 0, 0};
        ymd[Y] = Integer.parseInt(date.substring(0, 4));
        ymd[M] = Integer.parseInt(date.substring(4, 6));
        ymd[D] = Integer.parseInt(date.substring(6, 8));
        return ymd;
    }
   
    /**
     * 將不足兩位的月份或日期補足爲兩位
     * @param decimal
     * @return
     */
    public static String formatMonthDay(int decimal){
        DecimalFormat df = new DecimalFormat("00");
        return df.format( decimal );
    }
   
    /**
     * 將不足四位的年份補足爲四位
     * @param decimal
     * @return
     */
    public static String formatYear(int decimal){
        DecimalFormat df = new DecimalFormat("0000");
        return df.format( decimal );
    }
   
    /**
     * 取絕對值操作
     * @param num
     * @return
     */
    public static int abs(int num){
        return (num > 0) ? num : -num;
    }
   
    /**
     * 測試用main函數
     * @param args
     */
    public static void main( String[] args ) throws Exception{
        String currDate = "20001231";
        String currDate2 = "20001231";
        int days = -36600;
        Date date = null;
        DateCalculate dc = new DateCalculate();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        date = sdf.parse( currDate2 );
       
        System.out.println(currDate + " + " +
            abs(days) + "days = " + dc.addDays(currDate, abs(days)));
        System.out.println(currDate + " - " +
            abs(days) + "days = " + dc.reduceDays(currDate, abs(days)));

        Calendar cld = Calendar.getInstance();
        cld.setTime( date );
        cld.add(Calendar.DATE, abs(days));
        System.out.println(currDate2 + " + " +
            abs(days) + "days = " + sdf.format(cld.getTime()));
       
        cld = Calendar.getInstance();
        cld.setTime( date );
        cld.add(Calendar.DATE, days);
        System.out.println(currDate2 + " - " +
            abs(days) + "days = " + sdf.format(cld.getTime()));
       
        System.out.println(dc.addDaysByLoop(currDate2, abs(days)));
        System.out.println(dc.reduceDaysByLoop(currDate2, abs(days)));
    }

 

========================================================================================
java日期比較
java的日期比較方法(精確到秒):
public boolean compDate(String s1,String s2){
        int day=0;
        SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
        GregorianCalendar calendar1=new GregorianCalendar();
        GregorianCalendar calendar2=new GregorianCalendar();
        //String s1="2006-04-21";
        //String s2="2006-04-25";
        Date xxx1=new Date();
        Date xxx2=new Date();
        try {
            xxx1=sf.parse(s1);
            xxx2=sf.parse(s2);
            day = (int) ((xxx2.getTime() - xxx1.getTime()) / 3600 / 24 / 1000);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(day>10){
            return true;
        }else{
            return false;
        }
        }
========================================================================================

計算Java日期

    Java統計從1970年1月1日起的毫秒的數量表示日期。也就是說,例如,1970年1月2日,是在1月1日後的86,400,000毫秒。同樣的,1969年12月31日是在1970年1月1日前86,400,000毫秒。Java的Date類使用long類型紀錄這些毫秒值.因爲long是有符號整數,所以日期可以在1970年1月1日之前,也可以在這之後。Long類型表示的最大正值和最大負值可以輕鬆的表示290,000,000年的時間,這適合大多數人的時間要求。
Date 類
   Date類可以在java.util包中找到,用一個long類型的值表示一個指定的時刻。它的一個有用的構造函數是Date(),它創建一個表示創建時刻的對象。getTime()方法返回Date對象的long值。在下面的程序中,我使用Date()構造函數創建一個表示程序運行時刻的對象,並且利用getTime()方法找到這個日期代表的毫秒數量:

import java.util.*;


public class Now {
   public static void main(String[] args) {
      Date now = new Date();
      long nowLong = now.getTime();
      System.out.println("Value is " + nowLong);
   }
}

當我運行這個程序後,我得到972,568,255,150.快速確認一下這個數字,起碼在一個合理的範圍:它不到31年,這個數值相對1970年1月1日到我寫這篇文章的時間來說,是合理的。計算機是這個毫秒值表示時間,人們可不願意說" 我將在996,321,998,34見到你。"幸運的是,Java提供了一個轉換Date對象到字符串的途徑,表示成傳統的形式。我們在下一節討論DateFormat類,它直觀的建立日期字符串。
DateFormat類
 DateFormat類的一個目標是建立一個人們能夠識別的字符串。然而,因爲語言的差別,不是所有的人希望看到嚴格的相同格式的日期。法國人更喜歡看到"25 decembre 2000,",但是美國人習慣看到"December 25,2000."所以一個DateFormat的實例創建以後,這個對象包含了日期的顯示格式的信息。如果使用用戶電腦區域設置缺省的格式,你可以象下面那樣,創建DateFormat對象,使用getDateInstance()方法:

DateFormat df = DateFormat.getDateInstance();  

DateFormat類在java.text包中可以找到。
轉換成字符串
你可以使用format()方法轉換Date對象爲一個字符串。下面的示例程序說明了這個問題:

import java.util.*;
import java.text.*;

public class NowString {
   public static void main(String[] args) {
      Date now = new Date();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(now);
      System.out.println("Today is " + s);
   }

在上面的代碼中,展示了沒有參數,使用缺省格式的getDateInstance()方法。Java還提供了幾個選擇日期格式,你可以通過使用重載的getDateInstance(int style)獲得。出於方便的原因,DateFormat提供了幾種預置的常量,你可以使用這些常量參數。下面是幾個SHORT, MEDIUM, LONG, 和FULL類型的示例:

import java.util.*;
import java.text.*;

public class StyleDemo {
   public static void main(String[] args) {
      Date now = new Date();

      DateFormat df =  DateFormat.getDateInstance();
      DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT);
      DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM);
      DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG);
      DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL);
      String s =  df.format(now);
      String s1 = df1.format(now);
      String s2 = df2.format(now);
      String s3 = df3.format(now);
      String s4 = df4.format(now);

      System.out.println("(Default) Today is " + s);
      System.out.println("(SHORT)   Today is " + s1);
      System.out.println("(MEDIUM)  Today is " + s2);
      System.out.println("(LONG)    Today is " + s3);
      System.out.println("(FULL)    Today is " + s4);
   }
}

程序輸出如下:

(Default) Today is Nov 8, 2000
(SHORT)   Today is 11/8/00
(MEDIUM)  Today is Nov 8, 2000
(LONG)    Today is November 8, 2000
(FULL)    Today is Wednesday, November 8, 2000

同樣的程序,在我的電腦上使用缺省設置運行後,改變區域設置爲瑞典,輸出如下:

(Default) Today is 2000-nov-08
(SHORT)   Today is 2000-11-08
(MEDIUM)  Today is 2000-nov-08
(LONG)    Today is den 8 november 2000
(FULL)    Today is den 8 november 2000    
 
從這裏,你能看到,瑞典的月份不是大寫的(雖然November還是november).還有,LONG和FULL版本在瑞典語中是一樣的,但是美國英語卻不同。另外,有趣的是,瑞典語單詞的星期三,onsdag,沒有包含在FULL日期裏,英語卻包括。
注意你能夠使用getDateInstance()方法改變DateFormat實例的語種;但是,在上面的例子中,是通過改變Windows98的控制面板的區域設置做到的。不同的地方的區域設置不同,結果就不同,這樣有好處,也有不足,Java程序員應該瞭解這些。一個好處是Java程序員可以只寫一行代碼就可以顯示日期,而且世界不同地區的電腦運行同樣的程序會有不用的日期格式。 但是這也是一個缺點,當程序員希望顯示同一種格式的時--這也有可取之處,舉例來說,在程序中混合輸出文本和日期,如果文本是英文,我們就不希望日期格式是其他的格式,象德文或是西班牙文。如果程序員依靠日期格式編程,日期格式將根據運行程序所在電腦的區域設置不用而不同。
解析字符串
 通過parse()方法,DateFormat能夠以一個字符串創立一個Date對象。這個方法能拋出ParseException異常,所以你必須使用適當的異常處理技術。下面的例子程序通過字符串創建Date對象:

import java.util.*;
import java.text.*;

public class ParseExample {
   public static void main(String[] args) {
      String ds = "November 1, 2000";
      DateFormat df = DateFormat.getDateInstance();
      try {
         Date d = df.parse(ds);
      }
      catch(ParseException e) {
         System.out.println("Unable to parse " + ds);
      }
   }
}

在創建一個任意的日期時parse()方法很有用。我將通過另一種方法創建一個任意得日期。同時,你將看到怎樣進行基本日期計算,例如計算90天后的另一天。你可以使用GregorianCalendar類來完成這個任務。
GregorianCalendar類
 創建一個代表任意日期的一個途徑使用GregorianCalendar類的構造函數,它包含在java.util包中:

GregorianCalendar(int year, int month, int date)

注意月份的表示,一月是0,二月是1,以此類推,是12月是11。因爲大多數人習慣於使用單詞而不是使用數字來表示月份,這樣程序也許更易讀,父類Calendar使用常量來表示月份:JANUARY, FEBRUARY,等等。所以,創建Wilbur 和 Orville製造第一架動力飛機的日期(December 17, 1903),你可以使用:

GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17); 
出於清楚的考慮,你應該使用前面的形式。但是,你也應該學習怎樣閱讀下面的短格式。下面的例子同樣表示December 17,1903(記住,在短格式中,11表示December)

GregorianCalendar firstFlight = new GregorianCalendar(1903, 11, 17);  

在上一節中,你學習了轉換Date對象到字符串。這裏,你可以做同樣的事情;但是首先,你需要將GregorianCalendar對象轉換到Date。要做到這一點,你可以使用getTime()方法,從它得父類Calendar繼承而來。GetTime()方法返回GregorianCalendar相應的Date對象。你能夠創建GregorianCalendar對象,轉換到Date對象,得到和輸出相應的字符串這樣一個過程。下面是例子:

import java.util.*;
import java.text.*;

public class Flight {

   public static void main(String[] args) {
      GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);   
      Date d = firstFlight.getTime();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(d);
      System.out.println("First flight was " + s);
   }
}

有時候創建一個代表當前時刻的GregorianCalendar類的實例是很有用的。你可以簡單的使用沒有參數的GregorianCalendar構造函數,象這樣:

GregorianCalendar thisday = new GregorianCalendar();

一個輸出今天日期的例子程序,使用GregorianCalendar對象:

import java.util.*;
import java.text.*;

class Today {
   public static void main(String[] args) {
      GregorianCalendar thisday = new GregorianCalendar();
      Date d = thisday.getTime();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(d);
      System.out.println("Today is " + s);
   }
}

注意到,Date()構造函數和GregorianCalendar()構造函數很類似:都創建一個對象,條件簡單,代表今天。
日期處理
GregorianCalendar類提供處理日期的方法。一個有用的方法是add().使用add()方法,你能夠增加象年,月數,天數到日期對象中。要使用add()方法,你必須提供要增加的字段,要增加的數量。一些有用的字段是DATE, MONTH, YEAR, 和 WEEK_OF_YEAR。下面的程序使用add()方法計算未來80天的一個日期。在Jules的<環球80天>是一個重要的數字,使用這個程序可以計算Phileas Fogg從出發的那一天1872年10月2日後80天的日期:

import java.util.*;
import java.text.*;

public class World {
   public static void main(String[] args) {
      GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2);
      worldTour.add(GregorianCalendar.DATE, 80);
      Date d = worldTour.getTime();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(d);
      System.out.println("80 day trip will end " + s);
   }
}

這個例子是想象的,但在一個日期上增加天數是一個普遍的操作:影碟可以租3天,圖書館可以借書21天,商店經常需要將購買的物品在30天內賣出。下面的程序演示了使用年計算:

import java.util.*;
import java.text.*;

public class Mortgage {
   public static void main(String[] args) {
      GregorianCalendar mortgage = new GregorianCalendar(1997, Calendar.MAY, 18);
      mortgage.add(Calendar.YEAR, 15);
      Date d = mortgage.getTime();
      DateFormat df = DateFormat.getDateInstance();
      String s = df.format(d);
      System.out.println("15 year mortgage amortized on " + s);    }
}

    add()一個重要的副作用是它改變的原來的日期。有時候,擁有原始日期和修改後的日期很重要。不幸的是,你不能簡單的創建一個GregorianCalendar對象,設置它和原來的相等(equal)。原因是兩個變量指向同一個Date()對象地址。如果Date對象改變,兩個變量就指向改變後的日期對象。代替這種做法,應該創建一個新對象。下面的程序示範了這種做法:

import java.util.*;
import java.text.*;

public class ThreeDates {
   public static void main(String[] args) {
      GregorianCalendar gc1 = new GregorianCalendar(2000, Calendar.JANUARY, 1);
      GregorianCalendar gc2 = gc1;
      GregorianCalendar gc3 = new GregorianCalendar(2000, Calendar.JANUARY, 1);
      //Three dates all equal to January 1, 2000

      gc1.add(Calendar.YEAR, 1);
      file://gc1 and gc2 are changed

      DateFormat df = DateFormat.getDateInstance();

      Date d1 = gc1.getTime();
      Date d2 = gc2.getTime();
      Date d3 = gc3.getTime();

      String s1 = df.format(d1);
      String s2 = df.format(d2);
      String s3 = df.format(d3);

      System.out.println("gc1 is " + s1);
      System.out.println("gc2 is " + s2);
      System.out.println("gc3 is " + s3);
   }
}

    程序運行後,gc1和gc2被變成2001年(因爲兩個對象指向同一個Date,而Date已經被改變了)。對象gc3指向一個單獨的Date,它沒有被改變。
計算複習日期
在這節,你將看到一個依據現實世界的例子。這個詳細的程序計算過去一個具體的日期。例如,你閱讀這篇文章,你想要記住一個印象深刻的知識點。如果你沒有照片一樣的記憶力,你就要定期的複習這些新資料,這將幫助你記住它。關於複習系統,Kurt Hanks 和 Gerreld L. Pulsipher在他們的< Five Secrets to Personal Productivity個人能力的5個祕密>中有討論,建議看過第一眼後馬上回顧一下,然後是1天后,1個星期後,1個月後,3個月後,1年後。我的這篇文章,你要馬上回顧一下,從現在算起,再就是明天,然後是1個星期,1個月,3個月,1年後。我們的程序將計算這些日期。
這個程序非常有用的,它將是PIM(Personal Information Manager個人信息管理器)的一個組成部分,並將確定複習時間。在下面的程序中,getDates()方法對一個返回日期數組(複習日期)的電子軟件很有用。另外,你可以返回單獨的一個日期,使用getFirstDay(),getOneDay(),getOneWeek(),getOnMonth()和getOneYear().當時間範圍超出這個PIM的ReviewDates的計算範圍時ReviewDates類演示了怎樣計算時間段。現在,你可以容易的修改它用來處理你需要的時間段,象圖書館借書,錄影帶租賃和抵押計算。首先,ReviewDates類顯示在下面:

import java.util.*;
import java.text.*;

public class ReviewDates {
   private GregorianCalendar firstDay, oneDay, oneWeek, oneMonth, oneQuarter, oneYear;
   final int dateArraySize = 6;

   ReviewDates(GregorianCalendar gcDate) {
      int year = gcDate.get(GregorianCalendar.YEAR);
      int month = gcDate.get(GregorianCalendar.MONTH);
      int date = gcDate.get(GregorianCalendar.DATE);

      firstDay = new GregorianCalendar(year, month, date);
      oneDay = new GregorianCalendar(year, month, date);
      oneWeek = new GregorianCalendar(year, month, date);
      oneMonth = new GregorianCalendar(year, month, date);
      oneQuarter = new GregorianCalendar(year, month, date);
      oneYear = new GregorianCalendar(year, month, date);

      oneDay.add(GregorianCalendar.DATE, 1);
      oneWeek.add(GregorianCalendar.DATE, 7);
      oneMonth.add(GregorianCalendar.MONTH, 1);
      oneQuarter.add(GregorianCalendar.MONTH, 3);
      oneYear.add(GregorianCalendar.YEAR, 1);
   }

   ReviewDates() {
      this(new GregorianCalendar());
   }

   public void listDates() {
      DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
      Date startDate = firstDay.getTime();
      Date date1 = oneDay.getTime();
      Date date2 = oneWeek.getTime();
      Date date3 = oneMonth.getTime();
      Date date4 = oneQuarter.getTime();
      Date date5 = oneYear.getTime();

      String ss =  df.format(startDate);
      String ss1 = df.format(date1);
      String ss2 = df.format(date2);
      String ss3 = df.format(date3);
      String ss4 = df.format(date4);
      String ss5 = df.format(date5);

      System.out.println("Start date is " + ss);
      System.out.println("Following review dates are:");
      System.out.println(ss1);
      System.out.println(ss2);
      System.out.println(ss3);
      System.out.println(ss4);
      System.out.println(ss5);
      System.out.println();
   }

   public GregorianCalendar[] getDates() {
      GregorianCalendar[] memoryDates = new GregorianCalendar[dateArraySize];
      memoryDates[0] = firstDay;
      memoryDates[1] = oneDay;
      memoryDates[2] = oneWeek;
      memoryDates[3] = oneMonth;
      memoryDates[4] = oneQuarter;
      memoryDates[5] = oneYear;
      return memoryDates;
   }

   public GregorianCalendar getFirstDay() {
      return this.firstDay;
   }

   public GregorianCalendar getOneDay() {
      return this.oneDay;
   }

   public GregorianCalendar getOneWeek() {
      return this.oneWeek;
   }

   public GregorianCalendar getOneMonth() {
      return this.oneMonth;
   }

   public GregorianCalendar getOneQuarter() {
      return this.oneQuarter;
   }

   public GregorianCalendar getOneYear() {
      return this.oneYear;
   }
}

下面是使用ReviewDates類列出複習日期的例子程序:

import java.util.*;

public class ShowDates {
   public static void main(String[] args) {
      ReviewDates rd = new ReviewDates();
      rd.listDates();

      GregorianCalendar gc = new GregorianCalendar(2001, Calendar.JANUARY, 15);
      ReviewDates jan15 = new ReviewDates(gc);
      jan15.listDates();
   }
}

總結
 這篇文章介紹了關於日期處理的3個重要的類:Date,DateFormat,GregorianCalendar.這些類讓你創建日期,轉換成字符串,和計算日期基本元素。處理Java中的日期問題,這篇文章只是冰山一角。可是,我在這裏介紹的類和方法不僅僅是你學習高級技術的跳板,這些類和方法本身就可以處理很多通常的日期相關的任務
關於作者
 Robert Nielsen是SCJP。他擁有碩士學位,專攻計算機教育,並且在計算機領域執教多年。他也在各樣的雜誌上發表過很多計算機相關的文章


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/uniorg/archive/2008/05/06/2402009.aspx

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