java Calendar

Java中Calendar的使用方法

注 這是本人無(wú)恥復(fù)制,出處如下 http://outofmemory.cn/code-snippet/979/Java-Calendar-Date-usage-summary

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("現(xiàn)在時(shí)間是:"+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("現(xiàn)在時(shí)間是:"+year+"年"+month+"月"+day+"日,星期"+week);
     long year2009=calendar.getTimeInMillis();
     calendar.set(1989,9,26);//這里與真實(shí)的月份之間相差1
     long year1989=calendar.getTimeInMillis();
     long days=(year2009-year1989)/(1000*60*60*24);
     System.out.println("今天和1989年10月26日相隔"+days+"天,"+"也就是說(shuō)我在這個(gè)美麗的星球上已經(jīng)幸福的生活了"+days+"天。");

  }
}

Calendar類的靜態(tài)方法getInstance()可以初始化一個(gè)日歷對(duì)象:
Calendar now = Calendar.getInstance();
可以使用下面三個(gè)方法把日歷定到任何一個(gè)時(shí)間:

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) 

如果想獲得年份、月份、小時(shí)等信息可以使用:

Now.get(Calendar.Month) 這樣的方法 0表示一月,1表示二月
get(Calendar.DAY_OF_MONTH)獲得這個(gè)月的第幾天
get(Calendar.DAY_OF_WEEK)獲得這個(gè)星期的第幾天
get(Calendar.DAY_OF_YEAR)獲得這個(gè)年的第幾天
getTimeMillis()獲得當(dāng)前時(shí)間的毫秒表示

如下是Calendar類方法簡(jiǎn)介

abstract void add(int field, int amount) 根據(jù)日歷的規(guī)則,為給定的日歷字段添加或減去指定的時(shí)間量。
boolean after(Object when) 判斷此 Calendar 表示的時(shí)間是否在指定 Object 表示的時(shí)間之后,返回判斷結(jié)果。
boolean before(Object when) 判斷此 Calendar 表示的時(shí)間是否在指定 Object 表示的時(shí)間之前,返回判斷結(jié)果。
void clear()將此 Calendar 的所日歷字段值和時(shí)間值(從歷元至現(xiàn)在的毫秒偏移量)設(shè)置成未定義。
void clear(int field) 將此 Calendar 的給定日歷字段值和時(shí)間值(從歷元至現(xiàn)在的毫秒偏移量)設(shè)置成未定義。
Object clone()創(chuàng)建并返回此對(duì)象的一個(gè)副本。
int compareTo(Calendar anotherCalendar) 比較兩個(gè) Calendar 對(duì)象表示的時(shí)間值(從歷元至現(xiàn)在的毫秒偏移量)。
protected void complete()填充日歷字段中所有未設(shè)置的字段。
protected abstract void computeFields()將當(dāng)前毫秒時(shí)間值 time 轉(zhuǎn)換為 fields[] 中的日歷字段值。
protected abstract void computeTime()將 fields[] 中的當(dāng)前日歷字段值轉(zhuǎn)換為毫秒時(shí)間值 time。
boolean equals(Object obj) 將此 Calendar 與指定 Object 比較。
int get(int field)返回給定日歷字段的值。
int getActualMaximum(int field)給定此 Calendar 的時(shí)間值,返回指定日歷字段可能擁有的最大值。
int getActualMinimum(int field)給定此 Calendar 的時(shí)間值,返回指定日歷字段可能擁有的最小值。
static Locale[] getAvailableLocales()返回所有語(yǔ)言環(huán)境的數(shù)組,此類的 getInstance 方法可以為其返回本地化的實(shí)例。
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 及其相應(yīng)字段值。
int getFirstDayOfWeek()獲取一星期的第一天;例如,在美國(guó),這一天是 SUNDAY,而在法國(guó),這一天是 MONDAY。
abstract int getGreatestMinimum(int field)返回此 Calendar 實(shí)例給定日歷字段的最高的最小值。
static Calendar getInstance() 使用默認(rèn)時(shí)區(qū)和語(yǔ)言環(huán)境獲得一個(gè)日歷。
static Calendar getInstance(Locale aLocale) 使用默認(rèn)時(shí)區(qū)和指定語(yǔ)言環(huán)境獲得一個(gè)日歷。
static Calendar getInstance(TimeZone zone) 使用指定時(shí)區(qū)和默認(rèn)語(yǔ)言環(huán)境獲得一個(gè)日歷。
static Calendar getInstance(TimeZone zone, Locale aLocale) 使用指定時(shí)區(qū)和語(yǔ)言環(huán)境獲得一個(gè)日歷。
abstract int getLeastMaximum(int field) 返回此 Calendar 實(shí)例給定日歷字段的最低的最大值。
abstract int getMaximum(int field) 返回此 Calendar 實(shí)例給定日歷字段的最大值。
int getMinimalDaysInFirstWeek()獲取一年中第一個(gè)星期所需的最少天數(shù),例如,如果定義第一個(gè)星期包含一年第一個(gè)月的第一天,則此方法將返回 1。
abstract int getMinimum(int field) 返回此 Calendar 實(shí)例給定日歷字段的最小值。
Date getTime()返回一個(gè)表示此 Calendar 時(shí)間值(從歷元至現(xiàn)在的毫秒偏移量)的 Date 對(duì)象。
long getTimeInMillis()返回此 Calendar 的時(shí)間值,以毫秒為單位。
TimeZone getTimeZone()獲得時(shí)區(qū)。
int hashCode()返回該此日歷的哈希碼。
protected int internalGet(int field)返回給定日歷字段的值。
boolean isLenient()判斷日期/時(shí)間的解釋是否為寬松的。
boolean isSet(int field) 確定給定日歷字段是否已經(jīng)設(shè)置了一個(gè)值,其中包括因?yàn)檎{(diào)用 get 方法觸發(fā)內(nèi)部字段計(jì)算而導(dǎo)致已經(jīng)設(shè)置該值的情況。
abstract void roll(int field, boolean up) 在給定的時(shí)間字段上添加或減去(上/下)單個(gè)時(shí)間單元,不更改更大的字段。
void roll(int field, int amount) 向指定日歷字段添加指定(有符號(hào)的)時(shí)間量,不更改更大的字段。
void set(int field, int value) 將給定的日歷字段設(shè)置為給定值。
void set(int year, int month, int date) 設(shè)置日歷字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
void set(int year, int month, int date, int hourOfDay, int minute) 設(shè)置日歷字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second) 設(shè)置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。
void setFirstDayOfWeek(int value) 設(shè)置一星期的第一天是哪一天;例如,在美國(guó),這一天是 SUNDAY,而在法國(guó),這一天是 MONDAY。
void setLenient(boolean lenient) 指定日期/時(shí)間解釋是否是寬松的。
void setMinimalDaysInFirstWeek(int value) 設(shè)置一年中第一個(gè)星期所需的最少天數(shù),例如,如果定義第一個(gè)星期包含一年第一個(gè)月的第一天,則使用值 1 調(diào)用此方法。
void setTime(Date date) 使用給定的 Date 設(shè)置此 Calendar 的時(shí)間。
void setTimeInMillis(long millis) 用給定的 long 值設(shè)置此 Calendar 的當(dāng)前時(shí)間值。
void setTimeZone(TimeZone value) 使用給定的時(shí)區(qū)值來(lái)設(shè)置時(shí)區(qū)。
String toString() 返回此日歷的字符串表示形式 

Calendar的常用方法示例

1、計(jì)算某一月份的最大天數(shù)

Calendar time=Calendar.getInstance(); 
time.clear(); 
time.set(Calendar.YEAR,year); 
time.set(Calendar.MONTH,i-1);//注意,Calendar對(duì)象默認(rèn)一月為0             
int day=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天數(shù)
注:在使用set方法之前,必須先clear一下,否則很多信息會(huì)繼承自系統(tǒng)當(dāng)前時(shí)間

2、Calendar和Date的轉(zhuǎn)化
(1) Calendar轉(zhuǎn)化為Date

Calendar cal=Calendar.getInstance();
Date date=cal.getTime();

(2) Date轉(zhuǎn)化為Calendar

Date date=new Date();
Calendar cal=Calendar.getInstance();
cal.setTime(date);

3、格式化輸出日期時(shí)間

Date date=new Date();
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(df.format(date));

4、計(jì)算一年中的第幾星期

(1)計(jì)算某一天是一年中的第幾星期

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)計(jì)算一年中的第幾星期是幾號(hào)

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

可見(jiàn),roll()方法在本月內(nèi)循環(huán),一般使用add()方法;

6、計(jì)算兩個(gè)任意時(shí)間中間的間隔天數(shù)

(1)傳進(jìn)Calendar對(duì)象

/
**計(jì)算兩個(gè)時(shí)間之間相隔天數(shù)
 * @param startday  開(kāi)始時(shí)間
 * @param endday 結(jié)束時(shí)間
 * @return
 */
public int getIntervalDays(Calendar startday,Calendar endday){
    //確保startday在endday之前
    if(startday.after(endday)){
        Calendar cal=startday;
        startday=endday;
        endday=cal;
    }
    //分別得到兩個(gè)時(shí)間的毫秒數(shù)
    long sl=startday.getTimeInMillis();
    long el=endday.getTimeInMillis();

    long ei=el-sl;    
    //根據(jù)毫秒數(shù)計(jì)算間隔天數(shù)
    return (int)(ei/(1000*60*60*24));
}
(2)傳進(jìn)Date對(duì)象

/**計(jì)算兩個(gè)時(shí)間之間相隔天數(shù)
 * @param startday  開(kāi)始時(shí)間
 * @param endday 結(jié)束時(shí)間
 * @return
 */
public int getIntervalDays(Date startday,Date endday){
    //確保startday在endday之前
    if(startday.after(endday)){
        Date cal=startday;
        startday=endday;
        endday=cal;
    }
    //分別得到兩個(gè)時(shí)間的毫秒數(shù)
    long sl=startday.getTime();
    long el=endday.getTime();

    long ei=el-sl;    
    //根據(jù)毫秒數(shù)計(jì)算間隔天數(shù)
    return (int)(ei/(1000*60*60*24));
}
同理,可以用相同的方法計(jì)算出任意兩個(gè)時(shí)間相隔的小時(shí)數(shù),分鐘數(shù),秒鐘數(shù)等

注:以上方法是完全按時(shí)間計(jì)算,有時(shí)并不能令人滿意,如:

startday="2006-10-11 20:00:00" endday="2006-10-12 8:00:00"

計(jì)算結(jié)果為0,但是我們也許相讓計(jì)算結(jié)果變?yōu)?,此時(shí)可以用如下方法實(shí)現(xiàn):

在傳參之前,先設(shè)定endday的時(shí)間,如:

endday.set(Calendar.HOUR_OF_DAY, 23);
endday.set(Calendar.MINUTE, 59);
endday.set(Calendar.SECOND, 59);
endday.set(Calendar.MILLISECOND, 59);
這樣再傳進(jìn)去startday,endday,則結(jié)果就如我們所愿了。不過(guò),如果嫌以上方法麻煩,可以參考以下方法:

(3)改進(jìn)精確計(jì)算相隔天數(shù)的方法

    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);//得到當(dāng)年的實(shí)際天數(shù)
                d1.add(Calendar.YEAR, 1);
            } while (d1.get(Calendar.YEAR) != y2);
        }
        return days;
    } 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容