關於時間,日期,星期,月份的算法(Java中Calendar的使用方法)

    package cn.outofmemory.codes.Date;  
      
    import java.util.Calendar;  
    import java.util.Date;  
      
    public class CalendarDemo {  
      public static void main(String[] args) {  
         Calendar calendar=Calendar.getInstance();  
         calendar.setTime(new Date());  
         System.out.println("如今時間是:"+new Date());  
         String year=String.valueOf(calendar.get(Calendar.YEAR));  
         String month=String.valueOf(calendar.get(Calendar.MONTH)+1);  
         String day=String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));  
         String week=String.valueOf(calendar.get(Calendar.DAY_OF_WEEK)-1);  
         System.out.println("如今時間是:"+year+""+month+""+day+"日,星期"+week);  
         long year2009=calendar.getTimeInMillis();  
         calendar.set(1989,9,26);//這裏與真實的月份之間相差1  
         long year1989=calendar.getTimeInMillis();  
         long days=(year2009-year1989)/(1000*60*60*24);  
         System.out.println("今天和1989年10月26日相隔"+days+"天,"+"也就是說我在這個美麗的星球上已經幸福的生活了"+days+"天。");  
      
      }  
    }  
      
    Calendar類的靜態方法getInstance()能夠初始化一個日曆對象:  
      
    Calendar now = Calendar.getInstance();  
      
    能夠使用下面三個方法把日曆定到任何一個時間:  
      
    set(int year ,int month,int date)   
    set(int year ,int month,int date,int hour,int minute)   
    set(int year ,int month,int date,int hour,int minute,int second)   
      
    若是想得到年份、月份、小時等信息能夠使用:  
      
        Now.get(Calendar.Month) 這樣的方法 0表示一月,1表示二月  
        get(Calendar.DAY_OF_MONTH)得到這個月的第幾天  
        get(Calendar.DAY_OF_WEEK)得到這個星期的第幾天  
        get(Calendar.DAY_OF_YEAR)得到這個年的第幾天  
        getTimeMillis()得到當前時間的毫秒錶示  
      
    以下是Calendar類方法簡介  
      
        abstract void add(int field, int amount) 根據日曆的規則,爲給定的日曆字段添加或減去指定的時間量。  
        boolean after(Object when) 判斷此 Calendar 表示的時間是否在指定 Object 表示的時間以後,返回判斷結果。  
        boolean before(Object when) 判斷此 Calendar 表示的時間是否在指定 Object 表示的時間以前,返回判斷結果。  
        void clear()將此 Calendar 的所日曆字段值和時間值(從曆元至如今的毫秒偏移量)設置成未定義。  
        void clear(int field) 將此 Calendar 的給定日曆字段值和時間值(從曆元至如今的毫秒偏移量)設置成未定義。  
        Object clone()建立並返回此對象的一個副本。  
        int compareTo(Calendar anotherCalendar) 比較兩個 Calendar 對象表示的時間值(從曆元至如今的毫秒偏移量)。  
        protected void complete()填充日曆字段中全部未設置的字段。  
        protected abstract void computeFields()將當前毫秒時間值 time 轉換爲 fields[] 中的日曆字段值。  
        protected abstract void computeTime()將 fields[] 中的當前日曆字段值轉換爲毫秒時間值 time。  
        boolean equals(Object obj) 將此 Calendar 與指定 Object 比較。  
        int get(int field)返回給定日曆字段的值。  
        int getActualMaximum(int field)給定此 Calendar 的時間值,返回指定日曆字段可能擁有的最大值。  
        int getActualMinimum(int field)給定此 Calendar 的時間值,返回指定日曆字段可能擁有的最小值。  
        static Locale[] getAvailableLocales()返回全部語言環境的數組,此類的 getInstance 方法能夠爲其返回本地化的實例。  
        String getDisplayName(int field, int style, Locale locale) 返回給定 style 和 locale 下的日曆 field 值的字符串表示形式。  
        Map<String,Integer> getDisplayNames(int field, int style, Locale locale) 返回給定 style 和 locale 下包含日曆 field 全部名稱的 Map 及其相應字段值。  
        int getFirstDayOfWeek()獲取一星期的第一天;例如,在美國,這一天是 SUNDAY,而在法國,這一天是 MONDAY。  
        abstract int getGreatestMinimum(int field)返回此 Calendar 實例給定日曆字段的最高的最小值。  
        static Calendar getInstance() 使用默認時區和語言環境得到一個日曆。  
        static Calendar getInstance(Locale aLocale) 使用默認時區和指定語言環境得到一個日曆。  
        static Calendar getInstance(TimeZone zone) 使用指定時區和默認語言環境得到一個日曆。  
        static Calendar getInstance(TimeZone zone, Locale aLocale) 使用指定時區和語言環境得到一個日曆。  
        abstract int getLeastMaximum(int field) 返回此 Calendar 實例給定日曆字段的最低的最大值。  
        abstract int getMaximum(int field) 返回此 Calendar 實例給定日曆字段的最大值。  
        int getMinimalDaysInFirstWeek()獲取一年中第一個星期所需的最少天數,例如,若是定義第一個星期包含一年第一個月的第一天,則此方法將返回 1abstract int getMinimum(int field) 返回此 Calendar 實例給定日曆字段的最小值。  
        Date getTime()返回一個表示此 Calendar 時間值(從曆元至如今的毫秒偏移量)的 Date 對象。  
        long getTimeInMillis()返回此 Calendar 的時間值,以毫秒爲單位。  
        TimeZone getTimeZone()得到時區。  
        int hashCode()返回該此日曆的哈希碼。  
        protected int internalGet(int field)返回給定日曆字段的值。  
        boolean isLenient()判斷日期/時間的解釋是否爲寬鬆的。  
        boolean isSet(int field) 肯定給定日曆字段是否已經設置了一個值,其中包括由於調用 get 方法觸發內部字段計算而致使已經設置該值的狀況。  
        abstract void roll(int field, boolean up) 在給定的時間字段上添加或減去(上/下)單個時間單元,不更改更大的字段。  
        void roll(int field, int amount) 向指定日曆字段添加指定(有符號的)時間量,不更改更大的字段。  
        void set(int field, int value) 將給定的日曆字段設置爲給定值。  
        void set(int year, int month, int date) 設置日曆字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。  
        void set(int year, int month, int date, int hourOfDay, int minute) 設置日曆字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。  
        void set(int year, int month, int date, int hourOfDay, int minute, int second) 設置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。  
        void setFirstDayOfWeek(int value) 設置一星期的第一天是哪一天;例如,在美國,這一天是 SUNDAY,而在法國,這一天是 MONDAY。  
        void setLenient(boolean lenient) 指定日期/時間解釋是不是寬鬆的。  
        void setMinimalDaysInFirstWeek(int value) 設置一年中第一個星期所需的最少天數,例如,若是定義第一個星期包含一年第一個月的第一天,則使用值 1 調用此方法。  
        void setTime(Date date) 使用給定的 Date 設置此 Calendar 的時間。  
        void setTimeInMillis(long millis) 用給定的 long 值設置此 Calendar 的當前時間值。  
        void setTimeZone(TimeZone value) 使用給定的時區值來設置時區。  
        String toString() 返回此日曆的字符串表示形式  
      
    Calendar的經常使用方法示例  
      
    1、計算某一月份的最大天數  
      
    Calendar time=Calendar.getInstance();   
    time.clear();   
    time.set(Calendar.YEAR,year);   
    time.set(Calendar.MONTH,i-1);//注意,Calendar對象默認一月爲0               
    int day=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天數  
      
    注:在使用set方法以前,必須先clear一下,不然不少信息會繼承自系統當前時間  
      
    2、Calendar和Date的轉化  
      
    (1) Calendar轉化爲Date  
      
    Calendar cal=Calendar.getInstance();  
    Date date=cal.getTime();  
      
    (2) Date轉化爲Calendar  
      
    Date date=new Date();  
    Calendar cal=Calendar.getInstance();  
    cal.setTime(date);  
      
    3、格式化輸出日期時間  
      
    Date date=new Date();  
    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
    System.out.println(df.format(date));  
      
    4、計算一年中的第幾星期  
      
    (1)計算某一天是一年中的第幾星期  
      
    Calendar cal=Calendar.getInstance();  
    cal.set(Calendar.YEAR, 2006);  
    cal.set(Calendar.MONTH, 8);  
    cal.set(Calendar.DAY_OF_MONTH, 3);  
    int weekno=cal.get(Calendar.WEEK_OF_YEAR);  
      
    (2)計算一年中的第幾星期是幾號  
      
    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");  
    Calendar cal=Calendar.getInstance();  
    cal.set(Calendar.YEAR, 2006);  
    cal.set(Calendar.WEEK_OF_YEAR, 1);  
    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  
    System.out.println(df.format(cal.getTime()));  
      
    輸出:  
      
    2006-01-02  
      
    5、add()和roll()的用法  
      
    (1) add()方法  
      
    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");  
    Calendar cal=Calendar.getInstance();  
    cal.set(Calendar.YEAR, 2006);  
    cal.set(Calendar.MONTH, 8);  
    cal.set(Calendar.DAY_OF_MONTH, 3);  
    cal.add(Calendar.DATE, -4);  
    Date date=cal.getTime();  
    System.out.println(df.format(date));  
    cal.add(Calendar.DATE, 4);  
    date=cal.getTime();  
    System.out.println(df.format(date));  
      
    輸出:  
      
        2006-08-30  
        2006-09-03  
      
    (2)roll方法  
      
    cal.set(Calendar.YEAR, 2006);  
    cal.set(Calendar.MONTH, 8);  
    cal.set(Calendar.DAY_OF_MONTH, 3);  
    cal.roll(Calendar.DATE, -4);  
    date=cal.getTime();  
    System.out.println(df.format(date));  
    cal.roll(Calendar.DATE, 4);  
    date=cal.getTime();  
    System.out.println(df.format(date));  
      
    輸出:  
      
        2006-09-29  
        2006-09-03  
      
    可見,roll()方法在本月內循環,通常使用add()方法;  
      
    6、計算兩個任意時間中間的間隔天數  
      
    (1)傳進Calendar對象  
      
    /  
    **計算兩個時間之間相隔天數  
     * @param startday  開始時間  
     * @param endday 結束時間  
     * @return  
     */  
    public int getIntervalDays(Calendar startday,Calendar endday){  
        //確保startday在endday以前  
        if(startday.after(endday)){  
            Calendar cal=startday;  
            startday=endday;  
            endday=cal;  
        }  
        //分別獲得兩個時間的毫秒數  
        long sl=startday.getTimeInMillis();  
        long el=endday.getTimeInMillis();  
      
        long ei=el-sl;      
        //根據毫秒數計算間隔天數  
        return (int)(ei/(1000*60*60*24));  
    }  
      
    (2)傳進Date對象  
      
    /**計算兩個時間之間相隔天數 
     * @param startday  開始時間 
     * @param endday 結束時間 
     * @return 
     */  
    public int getIntervalDays(Date startday,Date endday){  
        //確保startday在endday以前  
        if(startday.after(endday)){  
            Date cal=startday;  
            startday=endday;  
            endday=cal;  
        }  
        //分別獲得兩個時間的毫秒數  
        long sl=startday.getTime();  
        long el=endday.getTime();  
      
        long ei=el-sl;      
        //根據毫秒數計算間隔天數  
        return (int)(ei/(1000*60*60*24));  
    }  
      
    同理,能夠用相同的方法計算出任意兩個時間相隔的小時數,分鐘數,秒鐘數等  
      
    注:以上方法是徹底按時間計算,有時並不能使人滿意,如:  
      
    startday="2006-10-11 20:00:00" endday="2006-10-12 8:00:00"  
      
    計算結果爲0,可是咱們也許相讓計算結果變爲1,此時能夠用以下方法實現:  
      
    在傳參以前,先設定endday的時間,如:  
      
    endday.set(Calendar.HOUR_OF_DAY, 23);  
    endday.set(Calendar.MINUTE, 59);  
    endday.set(Calendar.SECOND, 59);  
    endday.set(Calendar.MILLISECOND, 59);  
      
    這樣再傳進去startday,endday,則結果就如咱們所願了。不過,若是嫌以上方法麻煩,能夠參考如下方法:  
      
    (3)改進精確計算相隔天數的方法  
      
        public int getDaysBetween (Calendar d1, Calendar d2) {  
            if (d1.after(d2)) {  // swap dates so that d1 is start and d2 is end  
                java.util.Calendar swap = d1;  
                d1 = d2;  
                d2 = swap;  
            }  
            int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);  
            int y2 = d2.get(Calendar.YEAR);  
            if (d1.get(Calendar.YEAR) != y2) {  
                d1 = (Calendar) d1.clone();  
                do {  
                    days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);//獲得當年的實際天數  
                    d1.add(Calendar.YEAR, 1);  
                } while (d1.get(Calendar.YEAR) != y2);  
            }  
            return days;  
        }   

 
 

 
相關文章
相關標籤/搜索