第四部分 Calendar使用示例
下面,我們通過示例學習使用Calendar的API。CalendarTest.java的源碼如下:
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使用示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pat天梯赛L1-050. 倒数第N个字
- 下一篇: 微服务和微服务架构