Java開發筆記(四十二)日曆工具的常見應用

前面介紹了日曆工具Calendar的基本用法,乍看起來Calendar與Date兩個半斤八兩,彷佛沒有多大區別,那又何苦庸人自擾鼓搗一個新玩意呢?顯然這樣小瞧了Calendar,其實它的做用大着呢,接下來不妨深刻探討一下Calendar的幾種實際應用,主要包括:Calendar和Date類型互相轉換、計算兩個日曆時間的天數、打印當前月份的月曆等,分別說明以下。html

一、Calendar和Date類型互相轉換
雖然說Date早就應該被Calendar取代,但畢竟是前輩,並且Java也一直沒有拋棄它,特別有一點:Date擁有搭配的日期格式化工具SimpleDateFormat,能夠很方便地輸出指定格式的日期時間字符串,敢問Calendar有此絕活麼?既然Calendar沒法覆蓋Date的全部功能,那就必須支持互相轉換Calendar和Date類型,從而讓日期實例去執行日曆實例所不能完成的任務。由於類型轉換的要求是Calendar提出來的,因此這個轉換動做理應由它實現,這裏用到了Calendar的getTime方法和setTime方法,其中getTime方法的返回值就是Date類型的實例,而setTime方法可將Date實例填入Calendar實例。下面是經過getTime和setTime方法轉換日期類型和日曆類型的代碼例子:java

	// 把Calendar類型的數據轉換爲Date類型
	private static void convertCalendarToDate() {
		// 建立一個日曆實例
		Calendar calendar = Calendar.getInstance();
		// 調用日曆實例的getTime方法,得到日期信息
		Date date = calendar.getTime();
		System.out.println("convertCalendarToDate date=" + date.toString() + ", calendar=" + calendar.toString());
	}

	// 把Date類型的數據轉換爲Calendar類型
	private static void convertDateToCalendar() {
		// 建立一個日曆實例
		Calendar calendar = Calendar.getInstance();
		// 建立一個日期實例
		Date date = new Date();
		// 調用日曆實例的setTime方法,設置日期信息
		calendar.setTime(date);
		System.out.println("convertDateToCalendar date=" + date.toString() + ", calendar=" + calendar.toString());
	}

  

二、計算兩個日曆時間的天數
根據兩個給定的時間,計算兩者間隔的天數,這個業務場景也很常見。例如爲了安全起見,網站每隔若干天就要求用戶從新登陸;又如信用卡還款,銀行須要在還款日以前多少天提醒用戶等等。這時用到了Calendar的getTimeInMillis方法,該方法可返回毫秒計量的時間總數,只要把兩個日曆實例的時間總數相減,再把兩者的差額從毫秒單位換算成以天爲單位,便可求得這兩個日曆時間之間的天數。據此編寫的計算方法代碼以下所示:安全

	// 計算兩個日曆實例間隔的天數
	private static void countDays() {
		Calendar calendarA = Calendar.getInstance();
		// 設置第一個日曆實例的年月日
		calendarA.set(2018, 3, 15);
		Calendar calendarB = Calendar.getInstance();
		// 設置第二個日曆實例的年月日
		calendarB.set(2018, 9, 15);
		// 得到第一個日曆實例包含的時間總數(單位毫秒)
		long timeOfA = calendarA.getTimeInMillis();
		// 得到第二個日曆實例包含的時間總數(單位毫秒)
		long timeOfB = calendarB.getTimeInMillis();
		// 先計算兩者的差額,再把毫秒計量的差額轉換爲天數
		long dayCount = (timeOfB-timeOfA)/(1000*60*60*24);
		System.out.println("dayCount="+dayCount);
	}

  

三、打印當前月份的月曆
對於期待週末的學生和上班族來講,一份安排穩當的月曆是必不可少的,如今利用Calendar功能便能製做一個簡單的月曆。月曆的每行均爲一個星期,行首是星期一,行尾是星期日,而後分行打印當月從1號到月末的全部日子。其中的年、月、星期都是明確的,惟有月末的日子是變化着的,好比一、三、五、七、八、十、12這七個月的月末是31號,四、六、九、11這四個月的月末是30號,2月每逢閏年有29天、其它年份則有28天。假若爲了肯定當月的最後一天,就得本身編碼判斷這些繁複的細節,可謂是絞盡腦汁、傷筋動骨。所幸Calendar早已提供了getActualMaximum方法,該方法用於得到指定時間單位的最大合法值,若是指定的時間單位是Calendar.DATE,則該方法的返回值就爲當月的最後一天。因而獲取月末日子的代碼僅需下列一行而已:工具

		// 獲取當月的最後一天
		int lastDay = calendar.getActualMaximum(Calendar.DATE);

 

這下月曆具有的全部要素都集齊了,包括當前年份、當前月份、當月1號、當月最後一天,再把中間的日子分星期依次排列,一個簡潔樸素的月曆便出爐了。下面是使用日曆工具計算並打印當前月曆的代碼例子:網站

	// 打印當前月份的月曆
	private static void printMonthCalendar() {
		// 建立一個日曆實例
		Calendar calendar = Calendar.getInstance();
		// 設置日期爲當月1號
		calendar.set(Calendar.DATE, 1);
		// 得到該日期對應的星期幾
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		dayOfWeek = dayOfWeek==1 ? 7 : dayOfWeek-1;
		// 獲取當月的最後一天
		int lastDay = calendar.getActualMaximum(Calendar.DATE);
		// 拼接月曆開頭的年月
		String yearAndMonth = String.format("\n                     %d年%d月", 
				calendar.get(calendar.YEAR), calendar.get(calendar.MONTH)+1);
		System.out.println(yearAndMonth);
		System.out.println(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日");
		// 先補齊1號前面的空白
		for (int i=1; i<dayOfWeek; i++) {
			System.out.print("       ");
		}
		// 循環打印從一號到本月最後一天的日子
		for (int i=1; i<=lastDay; i++) {
			String today = String.format("%7d", i);
			System.out.print(today);
			// 若是當天是星期日,末尾就另起一行
			if ((dayOfWeek+i-1)%7 == 0) {
				System.out.println();
			}
		}
	}

 

運行上述的月曆代碼,觀察到的打印結果以下圖所示。編碼



更多Java技術文章參見《Java開發筆記(序)章節目錄spa

相關文章
相關標籤/搜索