第三部分 Calendar函数接口
第三部分 Calendar函數接口
1. Calendar的17個字段的公共接口
Calendar的這17個字段,都支持下面的公共函數接口。 這些公共接口的使用示例,請參考CalendarTest.java 示例中的 testAllCalendarSections() 函數。
(1) getMaximum(int field)
作用:獲取“字段的最大值”。注意“對比它和 getActualMaximum() 的區別”。 示例:以“MONTH”字段來說。使用方法為:
| 1 2 3 4 | // 獲取Calendar實例 Calendar cal = Calendar.getInstance(); // 獲取MONTH的最大值 int max = cal.getMaximum(Calendar.MONTH); |
若要獲取其它字段的最大值,只需要將示例中的MONTH相應的替換成其它字段名即可。
(2) getActualMaximum(int field)
作用:獲取“當前日期下,該字段的最大值”。 示例:以“MONTH”字段來說。使用方法為:
| 1 2 3 4 | // 獲取Calendar實例 Calendar cal = Calendar.getInstance(); // 獲取當前MONTH的最大值 int max = cal.getActualMaximum(Calendar.MONTH); |
若要獲取其它字段的最大值,只需要將示例中的MONTH相應的替換成其它字段名即可。
注意:對比getActualMaximum() 和 getMaximum() 的區別。參考下面的對比示例,
A、 getMaximum() 獲取的“字段最大值”,是指在綜合所有的日期,在所有這些日期中得出的“字段最大值”。
???? 例如,getMaximum(Calendar.DATE)的目的是“獲取‘日的最大值'”。綜合所有的日期,得出一個月最多有31天。因此,getMaximum(Calendar.DATE)的返回值是“31”!
B、 getActualMaximum() 獲取的“當前日期時,該字段的最大值”。
???? 例如,當日期為2013-09-01時,getActualMaximum(Calendar.DATE)是獲取“日的最大值”是“30”。當前日期是9月份,而9月只有30天。因此,getActualMaximum(Calendar.DATE)的返回值是“30”!
(3) getMinimum(int field)
作用:獲取“字段的最小值”。注意“對比它和 getActualMinimum() 的區別”。 示例:以“MONTH”字段來說。使用方法為:
| 1 2 3 4 | // 獲取Calendar實例 Calendar cal = Calendar.getInstance(); // 獲取MONTH的最小值 int min = cal.getMinimum(Calendar.MONTH); |
若要獲取其它字段的最小值,只需要將示例中的MONTH相應的替換成其它字段名即可。
(4) getActualMinimum(int field)
| 1 2 3 4 5 | 作用:獲取“當前日期下,該字段的最小值”。 示例:以“MONTH”字段來說。使用方法為: // 獲取Calendar實例 Calendar cal = Calendar.getInstance(); // 獲取MONTH的最小值 int min = cal.getMinimum(Calendar.MONTH); |
若要獲取其它字段的最小值,只需要將示例中的MONTH相應的替換成其它字段名即可。
注意:在Java默認的Calendar中,雖然 getMinimum() 和 getActualMinimum() 的含義不同;但是,它們的返回值是一樣的。因為Calendar的默認是返回GregorianCalendar對象,而在GregorianCalendar.java中,getMinimum() 和 getActualMinimum() 返回值一樣。
(5) get(int field)
作用:獲取“字段的當前值”。獲取field字段的當前值。 示例:以“MONTH”字段來說。“獲取MONTH的當前值”的方法為:
| 1 2 3 4 | // 獲取Calendar實例 Calendar cal = Calendar.getInstance(); // 獲取“cal日歷”的當前MONTH值 int MONTH = cal.get(Calendar.MONTH); |
若要獲取其它字段的當前值,只需要將示例中的MONTH相應的替換成其它字段名即可。
(6) set(int field, int value)
作用:設置“字段的當前值”。設置field字段的當前值為value 示例:以“MONTH”字段來說。“設置MONTH的當前值”的方法為:
| 1 2 3 4 | // 獲取Calendar實例 Calendar cal = Calendar.getInstance(); // 設置“cal日歷”的當前MONTH值為 1988年 cal.set(Calendar.MONTH, 1988); |
說明:
A、1988 是想要設置的MONTH的當前值。這個設置值必須是整數。
B、若要設置其它字段的當前值,只需要將示例中的MONTH相應的替換成其它字段名即可。
(7) add(int field, int value)
作用:給“字段的當前值”添加值。給field字段的當前值添加value。 示例:以“MONTH”字段來說。方法如下:
| 1 2 3 4 5 6 7 | // 獲取Calendar實例,并設置日期為“2013-09-01” Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 2013); cal.set(Calendar.MONTH, 8); cal.set(Calendar.DATE, 1); // 給“cal日歷”的當前MONTH值 “添加-10” cal.add(Calendar.MONTH, -10); |
說明:
A、 -10 是添加值。
???? 添加值可以為正數,也可以是負數。
???? 正數表示將日期增加,負數表示將日期減少。
???? 假設:現在cal的值是“2013-09-01”,現在我們將MONTH字段值增加-10。得到的結果是:“2012-10-01”。
???? 為什么會這樣呢?“2013-09-01”增加-10,也就是將日期向前減少10個月;得到的結果就是“2012-10-01”。
B、 Calendar的17個字段中:除了回滾Calendar.ZONE_OFFSET時,會拋出IllegalArgumentException異常;其它的字段都支持該操作。
C、 若要設置其它字段的當前值,只需要將示例中的MONTH相應的替換成其它字段名即可。
(8) roll(int field, int value)
作用:回滾“字段的當前值” 示例:以“MONTH”字段來說。“回滾MONTH的當前值”的方法為:
| 1 2 3 4 5 6 7 | // 獲取Calendar實例,并設置日期為“2013-09-01” Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 2013); cal.set(Calendar.MONTH, 8); cal.set(Calendar.DATE, 1); // 將“cal日歷”的當前MONTH值 “向前滾動10” cal.roll(Calendar.MONTH, -10); |
說明:
A、 -10 是回滾值。
???? 當回滾值是負數時,表示將當前字段向前滾;
???? 當回滾值是正數時,表示將當前字段向后滾。
???? 回滾Calendar中某一字段時,不更改更大的字段!
???? 這是roll()與add()的根據區別!add()可能會更改更大字段,比如“使用add()修改‘MONTH'字段,可能會引起‘YEAR'字段的改變”;但是roll()不會更改更大的字段,例如“使用roll()修改‘MONTH'字段,不回引起‘YEAR'字段的改變。”
???? 假設:現在cal的值是“2013-09-01”,現在我們將MONTH字段值增加-10。得到的結果是:“2013-10-01”。
???? 為什么會這樣呢?這就是因為“回滾”就是“在最小值和最大值之間來回滾動”。本例中,MONTH是9月,前回滾10,得到的值是10月,但是roll()不會改變“比MONTH”更大的字段,所以YEAR字段不會改變。所以結果是“2013-10-01”。
B、 Calendar的17個字段中:除了回滾Calendar.ZONE_OFFSET時,會拋出IllegalArgumentException異常;其它的字段都支持該操作。
C、 若要設置其它字段的當前值,只需要將示例中的MONTH相應的替換成其它字段名即可。
(9) clear(int field)
作用:清空“字段的當前值”。所謂清空,實際上是將“field”的值設置為0;若field最小值為1,則設置為1。 示例:以“MONTH”字段來說。“清空MONTH”的方法為:
| 1 2 3 4 5 | // 獲取Calendar實例,并設置日期為“9月” Calendar cal = Calendar.getInstance(); cal.set(Calendar.MONTH, 9); // 清空MONTH cal.clear(Calendar.MONTH); |
若要清空其它字段,只需要將示例中的MONTH相應的替換成其它字段名即可。
(10) isSet(int field)
作用:判斷“字段field”是否被設置。若調用clear()清空之后,則field變為“沒有設置狀態”。 示例:以“MONTH”字段來說。“判斷MONTH是否被設置”的方法為:
| 1 2 3 4 | // 獲取Calendar實例 Calendar cal = Calendar.getInstance(); // 判斷MONTH是否被設置 boolean bset = cal.isSet(Calendar.MONTH); |
若要判斷其它字段,只需要將示例中的MONTH相應的替換成其它字段名即可。
2. Calendar的其它函數
(1) 日期比較函數
Calendar的比較函數,主要有以下幾個:
| 1 2 3 4 5 6 7 8 9 10 11 | // 比較“當前Calendar對象”和“calendar” 的日期、時區等內容是否相等。 boolean equals(Object object) // 當前Calendar對象 是否 早于calendar boolean before(Object calendar) // 當前Calendar對象 是否 晚于calendar boolean after(Object calendar) // 比較“當前Calendar對象”和“calendar”。 // 若 早于 “calendar” 則,返回-1 // 若 相等, 則,返回0 // 若 晚于 “calendar” 則,返回1 int compareTo(Calendar anotherCalendar) |
這些函數的使用示例,請參考CalendarTest.java示例中的 testComparatorAPIs() 函數。
示例:假設cal1 和 cal2 都是Calendar的兩個對象。
| 1 2 3 4 5 | // 它們的使用方法如下 boolean isEqual = cal1.equals(cal2); boolean isBefore = cal1.before(cal2); boolean isAfter = cal1.after(cal2); int icompare = cal1.compareTo(cal2); |
(2) “寬容”函數
| 1 2 3 4 | // 設置“Calendar的寬容度” void setLenient(boolean value) // 獲取“Calendar的寬容度” boolean isLenient() |
這些函數的使用示例,請參考CalendarTest.java示例中的 testLenientAPIs() 函數。
說明:
Calendar 有兩種解釋日歷字段的模式,即 lenient 和 non-lenient。
A、 當 Calendar 處于 lenient 模式時,它可接受比它所生成的日歷字段范圍更大范圍內的值。當 Calendar 重新計算日歷字段值,以便由 get() 返回這些值時,所有日歷字段都被標準化。
???? 例如,lenient 模式下的 GregorianCalendar 將 MONTH == JANUARY、DAY_OF_MONTH == 32 解釋為 February 1。
B、 當 Calendar 處于 non-lenient 模式時,如果其日歷字段中存在任何不一致性,它都會拋出一個異常。
???? 例如,GregorianCalendar 總是在 1 與月份的長度之間生成 DAY_OF_MONTH 值。如果已經設置了任何超出范圍的字段值,那么在計算時間或日歷字段值時,處于 non-lenient 模式下的 GregorianCalendar 會拋出一個異常。
注意:在(02)步驟中的異常,在使用set()時不會拋出,而需要在使用get()、getTimeInMillis()、getTime()、add() 和 roll() 等函數中才拋出。因為set()只是設置了一個修改標志,而get()等方法才會引起時間的重新計算,此時才會拋出異常!
(3) "年月日(時分秒)"、Date、TimeZone、MilliSecond函數
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 設置“年月日” final void set(int year, int month, int day) // 設置“年月日時分” final void set(int year, int month, int day, int hourOfDay, int minute, int second) // 設置“年月日時分秒” final void set(int year, int month, int day, int hourOfDay, int minute) // 獲取Calendar對應的日期 final Date getTime() // 設置Calendar為date final void setTime(Date date) // 獲取Calendar對應的時區 TimeZone getTimeZone() // 設置Calendar對應的時區 void setTimeZone(TimeZone timezone) // 獲取Calendar對應的milliscondes值,就是“Calendar當前日期”距離“1970-01-01 0:00:00 GMT”的毫秒數 long getTimeInMillis() // 設置Calendar對應的milliscondes值 void setTimeInMillis(long milliseconds) |
這些函數的使用示例,請參考CalendarTest.java示例中的 testTimeAPIs() 函數。
(4) 其它操作
| 1 2 3 4 5 6 7 8 9 10 | // 克隆Calendar Object clone() // 獲取“每周的第一天是星期幾”。例如,在美國,這一天是 SUNDAY,而在法國,這一天是 MONDAY。 int getFirstDayOfWeek() // 設置“每周的第一天是星期幾”。例如,在美國,這一天是 SUNDAY,而在法國,這一天是 MONDAY。 void setFirstDayOfWeek(int value) // 獲取一年中第一個星期所需的最少天數,例如,如果定義第一個星期包含一年第一個月的第一天,則此方法將返回 1。如果最少天數必須是一整個星期,則此方法將返回 7。 int getMinimalDaysInFirstWeek() // 設置一年中第一個星期所需的最少天數,例如,如果定義第一個星期包含一年第一個月的第一天,則使用值 1 調用此方法。如果最少天數必須是一整個星期,則使用值 7 調用此方法。 void setMinimalDaysInFirstWeek(int value) |
這些函數的使用示例,請參考CalendarTest.java示例中的 testOtherAPIs() 函數。
第四部分 Calendar使用示例
下面,我們通過示例學習使用Calendar的API。CalendarTest.java的源碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | import java.util.Date; import java.util.Calendar; import java.util.TimeZone; import java.util.Random; public class CalendarTest { ?public static void main(String[] args) { ?// 測試Calendar的“17個字段的公共函數接口” ?testAllCalendarSections() ; ?// 測試Calendar的“比較接口” ?testComparatorAPIs() ; ?// 測試Calendar的“比較接口” ?testLenientAPIs() ; ?// 測試Calendar的Date、TimeZone、MilliSecond等相關函數 ?testTimeAPIs() ; ?// 測試Calendar的clone(),getFirstDayOfWeek()等接口 ?testOtherAPIs() ; ?} ?/** ?* 測試“Calendar的字段” ?* ?* @param cal -- Calendar對象 ?* @param field -- 要測試的“Calendar字段”。可以為以下值: ?* Calendar.YEAR, Calendar.MONTH, Calendar.DATE, ... 等等 ?* @param title -- 標題 ?*/ ?private static void testSection(Calendar cal, int field, String title) { ?final Random random = new Random(); ?final Date date = cal.getTime(); ?final int min = cal.getMinimum(field); // 獲取"字段最小值" ?final int max = cal.getMaximum(field); // 獲取“字段最大值” ?final int actualMin = cal.getActualMinimum(field); // 獲取"當前日期下,該字段最小值" ?final int actualMax = cal.getActualMaximum(field); // 獲取“當前日期下,該字段的最大值” ?// 獲取“字段的當前值” ?final int ori = cal.get(field);? ?// 設置“字段的當前值”, 并獲取“設置之后的值” ?final int r1 = random.nextInt(max); ?cal.set(field, r1);? ?final int set = cal.get(field);? ?try { ??// 回滾“字段的當前值”:在“字段最小值”和“字段最大值”之間回滾。 ??// “回滾值”可以為正,也可以為負。 ??cal.roll(field, -max);? ?} catch (IllegalArgumentException e) { ??// 當field == Calendar.ZONE_OFFSET時,會拋出該異常! ??e.printStackTrace(); ?} ?final int roll = cal.get(field);? ?// 獲取一個隨機值 ?final int sign = ( random.nextInt(2) == 1) ? 1 : -1; ?final int r2 = sign * random.nextInt(max); ?try { ??// 增加“字段的當前值” ,并獲取“新的當前字段值” ??// add的“參數值”可以為正,也可以為負。 ??cal.add(field, r2);? ?} catch (IllegalArgumentException e) { ??// 當field == Calendar.ZONE_OFFSET時,會拋出該異常! ??e.printStackTrace(); ?} ?final int add = cal.get(field); ?// 打印字段信息 ?System.out.printf("%s:\n\trange is [%d - %d] actualRange is [%d - %d]. original=%d, set(%d)=%d, roll(%d)=%d, add(%d)=%d\n", ??title, min, max, actualMin, actualMax, ori, r1, set, -max, roll, r2, add); ?} ?/** ?* 測試Calendar的“17個字段的公共函數接口” ?*/ ?private static void testAllCalendarSections() { ?// 00. ERA 字段 ?testSection(Calendar.getInstance(), Calendar.ERA, "Calendar.ERA"); ?// 01. YEAR 字段 ?testSection(Calendar.getInstance(), Calendar.YEAR, "Calendar.YEAR"); ?// 02. MONTH 字段 ?testSection(Calendar.getInstance(), Calendar.MONTH, "Calendar.MONTH"); ?// 03. WEEK_OF_YEAR 字段 ?testSection(Calendar.getInstance(), Calendar.WEEK_OF_YEAR, "Calendar.WEEK_OF_YEAR"); ?// 04. WEEK_OF_MONTH 字段 ?testSection(Calendar.getInstance(), Calendar.WEEK_OF_MONTH, "Calendar.WEEK_OF_MONTH"); ?// 05. DATE 字段 ?testSection(Calendar.getInstance(), Calendar.DATE, "Calendar.DATE"); ?// 06. DAY_OF_MONTH 字段 ?testSection(Calendar.getInstance(), Calendar.DAY_OF_MONTH, "Calendar.DAY_OF_MONTH"); ?// 07. DAY_OF_YEAR 字段 ?testSection(Calendar.getInstance(), Calendar.DAY_OF_YEAR, "Calendar.DAY_OF_YEAR"); ?// 08. DAY_OF_WEEK 字段 ?testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK, "Calendar.DAY_OF_WEEK"); ?// 09. DAY_OF_WEEK_IN_MONTH 字段 ?testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK_IN_MONTH, "Calendar.DAY_OF_WEEK_IN_MONTH"); ?// 10. AM_PM 字段 ?testSection(Calendar.getInstance(), Calendar.AM_PM, "Calendar.AM_PM"); ?// 11. HOUR 字段 ?testSection(Calendar.getInstance(), Calendar.HOUR, "Calendar.HOUR"); ?// 12. HOUR_OF_DAY 字段 ?testSection(Calendar.getInstance(), Calendar.HOUR_OF_DAY, "Calendar.HOUR_OF_DAY"); ?// 13. MINUTE 字段 ?testSection(Calendar.getInstance(), Calendar.MINUTE, "Calendar.MINUTE"); ?// 14. SECOND 字段 ?testSection(Calendar.getInstance(), Calendar.SECOND, "Calendar.SECOND"); ?// 15. MILLISECOND 字段 ?testSection(Calendar.getInstance(), Calendar.MILLISECOND, "Calendar.MILLISECOND"); ?// 16. ZONE_OFFSET 字段 ?testSection(Calendar.getInstance(), Calendar.ZONE_OFFSET, "Calendar.ZONE_OFFSET"); ?} ?/** ?* 測試Calendar的“比較接口” ?*/ ?private static void testComparatorAPIs() { ?// 新建cal1 ,且時間為1988年 ?Calendar cal1 = Calendar.getInstance(); ?cal1.set(Calendar.YEAR, 1988); ?// 新建cal2 ,且時間為2000年 ?Calendar cal2 = Calendar.getInstance(); ?cal2.set(Calendar.YEAR, 2000); ?// 新建cal3, 為cal1的克隆對象 ?Calendar cal3 = (Calendar)cal1.clone(); ?// equals 判斷 cal1和cal2的“時間、時區等”內容是否相等 ?boolean isEqual12 = cal1.equals(cal2); ?// equals 判斷 cal1和cal3的“時間、時區等”內容是否相等 ?boolean isEqual13 = cal1.equals(cal3); ?// cal1是否比cal2早 ?boolean isBefore = cal1.before(cal2); ?// cal1是否比cal2晚 ?boolean isAfter = cal1.after(cal2); ?// 比較cal1和cal2 ?// (01) 若cal1 早于 cal2,返回-1 ?// (02) 若cal1 等于 cal2,返回0 ?// (03) 若cal1 晚于 cal2,返回1 ?int icompare = cal1.compareTo(cal2); ?System.out.printf("\ntestComparatorAPIs: isEuqal12=%s, isEqual13=%s, isBefore=%s, isAfter=%s, icompare=%s\n", ??isEqual12, isEqual13, isBefore, isAfter, icompare); ?} ?/** ?* 測試Calendar的“比較接口” ?*/ ?private static void testLenientAPIs() { ??Calendar cal = Calendar.getInstance(); ??// 獲取默認的“寬容度”。返回true ??boolean oriLenient = cal.isLenient(); ??// MONTH值只能是“0-11”,這里越界。但是由于當前cal是寬容的,所以不會拋出異常 ??cal.set(Calendar.MONTH, 50); ??// 設置“寬容度”為false。 ??cal.setLenient(false); ??// 獲取設置后的“寬容度” ??boolean curLenient = cal.isLenient(); ??try { ??// MONTH值只能是“0-11”,這里越界。而且當前cal是不寬容的,所以會產生異常。 ??// 但是,異常到下次計算日期時才會拋出。即,set()中不回拋出異常,而要等到get()中才會拋出異常 ??cal.set(Calendar.MONTH, 50); ??// 此時,對cal進行讀取。讀取會導致重新計算cal的值,所以此時拋出異常! ??int m2 = cal.get(Calendar.MONTH); ?} catch (IllegalArgumentException e) { ??e.printStackTrace(); ?} ?System.out.printf("\ntestLenientAPIs: oriLenient=%s, curLenient=%s\n", ??oriLenient, curLenient); ?} ?/** ?* 測試Calendar的Date、TimeZone、MilliSecond等相關函數 ?*/ ?private static void testTimeAPIs() { ?Calendar cal = Calendar.getInstance(); ?// 設置cal的時區為“GMT+8” ?cal.setTimeZone(TimeZone.getTimeZone("GMT+8")); ?// 獲取當前的cal時區 ?TimeZone timezone = cal.getTimeZone(); ?// 設置 milliseconds ?cal.setTimeInMillis(1279419645742l); ?// 獲取 milliseconds ?long millis = cal.getTimeInMillis(); ?// 設置 milliseconds之后,時間也改變了。 ?// 獲取cal對應的日期 ?Date date = cal.getTime(); ?// 設置時間為“1988-08-08” ?cal.set(1988, 08, 08); ?// 設置時間為“1999-09-09 09:09” ?cal.set(1999, 09, 09, 9, 9); ?// 設置時間為“2000-10-10 10:10:10” ?cal.set(2000, 10, 10, 10, 10, 10); ?System.out.printf("\ntestTimeAPIs: date=%s, timezone=%s, millis=%s\n", ??date, timezone, millis); ?} ?/** ?* 測試Calendar的clone(),getFirstDayOfWeek()等接口 ?*/ ?private static void testOtherAPIs() { ?Calendar cal = Calendar.getInstance(); ?// 克隆cal ?Calendar clone = (Calendar)cal.clone(); ?// 設置 為 2013-01-10。 ?// 注:2013-01-01 為“星期二”,2013-01-06為“星期天”, ?clone.set(Calendar.YEAR, 2013); ?clone.set(Calendar.MONTH, 0); ?clone.set(Calendar.DATE, 10); ?// 設置“本年的第一個星期最少包含1天”。 ?// 則2013-01-10屬于第2個星期 ?clone.setMinimalDaysInFirstWeek(1); ?int m1 = clone.getMinimalDaysInFirstWeek(); ?int index1 = clone.get(Calendar.WEEK_OF_YEAR); ?// 設置“本年的第一個星期最少包含7天”。 ?// 則2013-01-10屬于第1個星期 ?clone.setMinimalDaysInFirstWeek(7); ?int m2 = clone.getMinimalDaysInFirstWeek(); ?int index2 = clone.get(Calendar.WEEK_OF_YEAR); ?// 設置“每周的第一天是星期幾”。 ?clone.setFirstDayOfWeek(Calendar.WEDNESDAY); ?// 獲取“每周的第一天是星期幾”。 ?int firstdayOfWeek = clone.getFirstDayOfWeek(); ?System.out.printf("\ntestOtherAPIs: firstdayOfWeek=%s, [minimalDay, WeekOfYear]={(%s, %s), (%s, %s)} %s\n", ??firstdayOfWeek, m1, index1, m2, index2, clone.getTime()); ?} } |
第五部分 自定義的Calendar接口示例
這些接口在寫日歷程序時可能會用到。
源代碼如下(CalendarSelfDefineTest.java):
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | import java.util.Calendar; /** ?* 根據Calendar的API封裝的一些常用函數 ?*/ public class CalendarSelfDefineTest { ?public static void main(String[] args) { ?Calendar cal = Calendar.getInstance(); ?// 設置日期為“2013-09-18” ?cal.set(2013, Calendar.SEPTEMBER, 18); ?// 獲取“年” ?System.out.printf("year: %s\n", getYear(cal) ); ?// 獲取“月” ?System.out.printf("month: %s\n", getMonth(cal) ); ?// 獲取“上月” ?System.out.printf("previcou month: %s\n", getLastMonth(cal) ); ?// 獲取“下月” ?System.out.printf("next month: %s\n", getNextMonth(cal) ); ?// 獲取“日” ?System.out.printf("day: %s\n", getDay(cal) ); ?// 獲取Cal對應星期幾 ?System.out.printf("weekday: %s\n", getWeekDay(cal) ); ?// 本月天數 ?System.out.printf("Current Month days: %s\n", getMonthDays(cal) ); ?// 上月天數 ?System.out.printf("Previcous Month days: %s\n", getPrevMonthDays(cal) ); ?// 下月天數 ?System.out.printf("Next Month days: %s\n", getNextMonthDays(cal) ); ?// 獲取當月第一天的星期幾 ?System.out.printf("First day' weekday : %s\n", getFirstDayWeekday(cal) ); ?// 獲取當前月最后一天的星期幾 ?System.out.printf("Last day' weekday : %s\n", getLastDayWeekday(cal) ); ?// 獲取上月最后一天的星期幾 ?System.out.printf("PrevMonth Last day' weekday: %s\n", getLastDayWeekdayOfPrevMonth(cal) ); ?// 獲取下月第一天的星期幾 ?System.out.printf("NextMonth First day' weekday: %s\n", getFirstDayWeekdayOfNextMonth(cal) ); ?} ?/** ?* 獲取“年” ?* ?* @return 例如,2013-09-18,則返回2013 ?*/ ?public static int getYear(Calendar cal) { ?return cal.get(Calendar.YEAR); ?} ?/** ?* 獲取“月” ?* ?* @return 返回值可以為以下值: ?* JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER。 ?* 其中第一個月是 JANUARY,它為 0。 ?* ?* 例如,2013-09-18,則返回8 ?*/ ?public static int getMonth(Calendar cal) { ?return cal.get(Calendar.MONTH); ?} ?/** ?* 獲取“上一個月” ?* ?* @return 返回值可以為以下值: ?* JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER。 ?* 其中第一個月是 JANUARY,它為 0。 ?* ?* 例如,2012-01-12的上一個月是“11”(即DECEMBER)。 ?*/ ?public static int getLastMonth(Calendar cal) { ?return (cal.get(Calendar.MONTH) + 11) % 12; ?} ?/** ?* 獲取“下一個月” ?* ?* @return 返回值可以為以下值: ?* JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER。 ?* 其中第一個月是 JANUARY,它為 0。 ?* ?* 例如,2013-12-12的下一個月是“1”(即DECEMBER)。 ?*/ ?public static int getNextMonth(Calendar cal) { ?return (cal.get(Calendar.MONTH) + 13) % 12; ?} ?/** ?* 獲取“日” ?* ?* @return 例如,2013-09-18,則返回18 ?* ?*/ ?public static int getDay(Calendar cal) { ?return cal.get(Calendar.DATE); ?} ?/** ?* 獲取“本月的天數” ?* ?* @return 例如,2013-09-18,則返回30 ?* ?*/ ?public static int getMonthDays(Calendar cal) { ?return cal.getActualMaximum(Calendar.DATE); ?} ?/** ?* 獲取“上一個月的天數” ?* ?* @return 例如,2013-01-18,則返回31 (因為2012-12有31天) ?* ?*/ ?public static int getPrevMonthDays(Calendar cal) { ?Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面對tmpCal操作,就不會改變cal ?tmpCal.add(Calendar.MONTH, -1);?? // 設為“上一個月” ?return tmpCal.getActualMaximum(Calendar.DATE); ?} ?/** ?* 獲取“下一個月的天數” ?* ?* @return 例如,2013-12-18,則返回31 (因為2014-01有31天) ?* ?*/ ?public static int getNextMonthDays(Calendar cal) { ?Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面對tmpCal操作,就不會改變cal ?tmpCal.add(Calendar.MONTH, 1);?? // 設為“下一個月” ?return tmpCal.getActualMaximum(Calendar.DATE); ?} ?/** ?* 獲取Cal對應星期幾 ?* ?* @return 返回“星期幾”,可以為以下值: ?* SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY 和 SATURDAY。 ?* SUNDAY為1,MONDAY為2,依次類推。 ?* 例如,2013-09-18(星期三),則返回4 ?*/ ?public static int getWeekDay(Calendar cal) { ?return cal.get(Calendar.DAY_OF_WEEK); ?} ?/** ?* 獲取當月第一天對應星期幾 ?* ?* @return SUNDAY為1,MONDAY為2,依次類推。 ?*/ ?public static int getFirstDayWeekday(Calendar cal) { ?Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面對tmpCal操作,就不會改變cal ?tmpCal.set(Calendar.DATE, 1);?? // 把日期設置為當月第一天 ?return tmpCal.get(Calendar.DAY_OF_WEEK); ?} ?/** ?* 獲取當前月最后一天對應星期幾 ?* ?* @return SUNDAY為1,MONDAY為2,依次類推。 ?*/ ?public static int getLastDayWeekday(Calendar cal) { ?Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面對tmpCal操作,就不會改變cal ?tmpCal.set(Calendar.DATE, 1);?? // 把日期設置為當月第一天 ?tmpCal.roll(Calendar.DATE, -1);?? // 把日期設置為當月最后一天 ?return tmpCal.get(Calendar.DAY_OF_WEEK); ?} ?/** ?* 獲取上月最后一天的星期幾 ?* ?* @return SUNDAY為1,MONDAY為2,依次類推。 ?*/ ?public static int getLastDayWeekdayOfPrevMonth(Calendar cal) { ?Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面對tmpCal操作,就不會改變cal ?tmpCal.set(Calendar.DATE, 1);?? // 把日期設置為當月第一天 ?tmpCal.add(Calendar.DATE, -1);?? // 把日期設置為上一個月最后一天 ?return tmpCal.get(Calendar.DAY_OF_WEEK); ?} ?/** ?* 獲取下月第一天的星期偏移 ?* ?* @return SUNDAY為1,MONDAY為2,依次類推。 ?*/ ?public static int getFirstDayWeekdayOfNextMonth(Calendar cal) { ?Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面對tmpCal操作,就不會改變cal ?tmpCal.add(Calendar.MONTH, 1);?? // 設為“下一個月” ?tmpCal.set(Calendar.DATE, 1);?? // 設為“第一天” ?return tmpCal.get(Calendar.DAY_OF_WEEK); ?} } |
總結
以上是生活随笔為你收集整理的第三部分 Calendar函数接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内核程序实现多文件的调用
- 下一篇: 解决 Ubuntu 无法更新软件问题