1. 程式人生 > >JAVA 日期比較、計算

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。他擁有碩士學位,專攻計算機教育,並且在計算機領域執教多年。他也在各樣的雜誌上發表過很多計算機相關的文章

相關推薦

JAVA 日期比較計算

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

Java 日期比較(上下午篇)

Java 日期比較 (上下午篇) 一、java.util.Date篇 Date date = new Date(); Date dateTime1 = new Date(date.getYear(),

Java 日期比較大小

import java.text.Format; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 日期比較大小的兩種方式 *

Java 字串比較拼接問題

@[TOC](字串的比較) /——————————————————**字串型別**—————————————————/ Java中用於處理字串常用的有三個類: 1、java.lang.String 2、java.lang.StringBuffer 3、java.lang.StrungBuilder 相

Java 計算日期減一天

public static void main(String[] args) throws ParseException { SimpleDateFormat

java 日期加減天數月數年數的計算方式+java實現給指定日期加固定小時月+java判斷當前日期是星期幾

本篇文章主要介紹一下Calendar類的對時間對一些使用方法:java 日期加減天數、月數、年數的計算方式, java實現給指定日期加固定小時、天、月,java判斷當前日期是星期幾,java判斷某個時間是否在條件時間之內。 程式碼: public static voi

js格式化日期計算時間差

js格式化日期、計算時間差var startTime ="20170501"var endTime = "20170430"var pattern = /(\d{4})(\d{2})(\d{2})/;var startTime_f = startTime.replace(pattern, ‘$1-$2-$3‘

Java中StringStringBuilderStringBuffer常用源碼分析及比較(一):String源碼分析

array string類 都是 epo sys 匹配字符串 bound 地址 簡單 String: 一、成員變量: /** The value is used for character storage. */ private final char value[

Java中StringStringBuilderStringBuffer常用源碼分析及比較(二):StringBuilderStringBuffer源碼分析

string類型 character private 字符 代碼 less pri des over StringBuilder: 一、構造方法: /** * Constructs a string builder with no characters in i

Java中StringStringBuilderStringBuffer常用源碼分析及比較(三):StringStringBuilderStringBuffer比較

val str 成員變量 相同 += let .get end art 看這篇隨筆之前請務必先看前面兩章: Java中String、StringBuilder、StringBuffer常用源碼分析及比較(一):String源碼分析 Java中String、StringBui

java java中subStringsplitstringTokenizer三種擷取字串方法的效能比較

面試的時候,string  基本上是必須問的知識   突然想起面試的時候曾經被人問過:都知道在大資料量情況下,使用String的split擷取字串效率很低,有想過用其他的方法替代嗎?用什麼替代?我當時的回答很斬釘截鐵:沒有。 google了一下,發現有2中替代方法,於

高併發程式設計系列:4種常用Java執行緒鎖的特點,效能比較使用場景

高併發程式設計系列:4種常用Java執行緒鎖的特點,效能比較、使用場景 http://youzhixueyuan.com/4-kinds-of-java-thread-locks.html   在Java併發程式設計中,經常遇到多個執行緒訪問同一個 共享資源 ,這時候作為開發者

rabbitmq directfanouttopic 三種Exchange java 程式碼比較

Producer端 1、channel的建立   無論是才用什麼樣的Exchange,建立channel程式碼都是相同的,如下   1 ConnectionFactory factory = new ConnectionFactory(); 2 factory

Java 處理日期周加減運算

1.java 日期加減運算 GregorianCalendar gc = new GregorianCalendar(); //java中對日期的加減操作 gc.add(1,-1);//表示年份減一. gc.add(2,-1);//表示月份減一. gc.add(3,-1);//表示周減一

python日期模組datetime常用操作總結(字串與datetime物件互轉日期差值計算時間戳獲取時間陣列生成等)

     在python中,自帶的datetime和time兩個時間模組在平時的使用中可以滿足我們絕大多數的需求,但是由於缺乏對這些模組深度的瞭解和使用,導致平時能夠使用到的時間功能十分有限,例如:對於time模組,我的使用幾乎就是停留在程式執行時間的統計和時間戳生成這

4種常用Java執行緒鎖的特點,效能比較使用場景

文章目錄 多執行緒的緣由 多執行緒併發面臨的問題 4種Java執行緒鎖(執行緒同步) Java執行緒鎖總結 多執行緒的緣由 在出現了程序之後,作業系統的效能得到了大大的提升。雖然程序的出現解決了作業系統的併

PostgresqlHiveQL時間日期比較及加減寫法

一、postgreSQL ----當前時間 now()   >>2018-09-14 16:46:51.103709+08 current_timestamp   >>2018-09-14 16:47:58.547305+08----當前日期 cur

java中的日期轉換springmvc接收前臺的Date型別引數遇到的坑

關於springmvc接收前臺傳的時間型別引數 前臺jsp用的一個日期外掛,後臺獲取一直有問題。 被這個問題搞了好久,其實很簡單。記錄下來,希望可以幫到遇到同樣問題的同學。 我專案使用的ssm框架, 在做web開發的時候,頁面傳入的都是String型別,SpringMVC可以對一些基本的型別

Java集合——HashMapHashTable以及ConCurrentHashMap異同比較

0. 前言 HashMap和HashTable的區別一種比較簡單的回答是: (1)HashMap是非執行緒安全的,HashTable是執行緒安全的。 (2)HashMap的鍵和值都允許有null存在,而HashTable則都不行。 (3)因為執行緒安全、雜湊效率的

Java 日期時間比較

Java使用以下三種方法來比較兩個日期: 使用 getTime() 方法獲取兩個日期(自1970年1月1日經歷的毫秒數值),然後比較這兩個值。 使用方法 before(),after() 和 equals()。例如,一個月的12號比18號早,則 new Date(99,