1. 程式人生 > >java:通過LocalDate實現日曆效果

java:通過LocalDate實現日曆效果

看書《java核心技術I》提到:用來儲存時間的兩個類為Date和LocalDate。

LocalDate類採用的是時間和日曆分開,不需要使用構造器來構造一個LocalDate物件,而直接使用靜態工廠方法來構造一個物件。

下面就通過LocalDate類,寫出一個與日曆相當的程式:

實現目標:


package cn.tzs.testLocalDate;

import java.time.*;
public class TestLocalDate {
	public static void main(String[] args){
		LocalDate date = LocalDate.of(2018,2,12);
		
		int month = date.getMonthValue();
		int today = date.getDayOfMonth();
		//int year = date.getYear();
		
		//將date設定為當前月的第一天
		date = date.minusDays(today-1);
		DayOfWeek weekday = date.getDayOfWeek();
		int value = weekday.getValue();
		System.out.println("Mon Tue Wed Thu Fri Sat Sun");
		
		//當前的星期與實際星期差幾,就打列印幾個空格佔位。
		for(int i = 1; i<value;i++){
			System.out.print("    ");
		}
		//只要日期的當前月值為給定的月份值 ,就執行迴圈體
		while(date.getMonthValue() == month){
			//格式化輸出當前日期在月份中的第幾天
			System.out.printf("%3d",date.getDayOfMonth());
			//當前月份日期與,給定的日期相等時,則在後面加上*
			if(date.getDayOfMonth() == today){
				System.out.print("*");
			}else{
				System.out.print(" ");
			}
			//每列印一個日期後,則把當前日期向後移一天
			date = date.plusDays(1);
			//如果當前日期,是一個星期的星期一,則列印一個換行符。
			if(date.getDayOfWeek().getValue() == 1) System.out.println();
		}
		if(date.getDayOfWeek().getValue() != 1) System.out.println();

	}
}
執行結果,如上圖所示。

但是,現在很多手機、電腦上的日曆,都是上、下兩個月時間,進行聯動顯示的,如何實現呢?通過百度,發現在java.time.*包中還有一個類,是專門用來處理時間:TemporalAdjusters類。使用方法,如下:

import java.time.temporal.TemporalAdjusters;   //必須引入TemporalAdjusters包
// 取當前日期:
LocalDate today = LocalDate.now(); // -> 2014-12-24
// 根據年月日取日期:
LocalDate crischristmas = LocalDate.of(2014, 12, 25); // -> 2014-12-25
// 根據字串取:
LocalDate endOfFeb = LocalDate.parse("2014-02-28"); // 嚴格按照ISO yyyy-MM-dd驗證,02寫成2都不行,當然也有一個過載方法允許自己定義格式
LocalDate.parse("2014-02-29"); // 無效日期無法通過:DateTimeParseException: Invalid date
// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2017-03-01
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2017-03-02
// 取本月最後一天,再也不用計算是28,29,30還是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2017-12-31
// 取下一天:
LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 變成了2018-01-01
// 取2017年1月第一個週一,用Calendar要死掉很多腦細胞:
LocalDate firstMondayOf2015 = LocalDate.parse("2017-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2017-01-02
實現目標:上、下月聯動的日曆:
package cn.tzs.testLocalDate;

import java.time.*;
import java.time.temporal.TemporalAdjusters;
public class TestLocalDate {
	public static void main(String[] args){
		LocalDate date = LocalDate.of(2018,2,12);
		
		int month = date.getMonthValue();
		int today = date.getDayOfMonth();
		//int year = date.getYear();
		
		//將date設定為當前月的第一天
		date = date.minusDays(today-1);
		DayOfWeek weekday = date.getDayOfWeek();
		int value = weekday.getValue();
		System.out.println("Mon Tue Wed Thu Fri Sat Sun");
		
		//當前的星期與實際星期差幾,就打列印幾個空格佔位。
		//如何實現列印上月的幾天呢?
		
		LocalDate up = date.minusMonths(1);
		int last = up.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
		//System.out.println(last);
		//System.out.println(value);
		
		for(int i=value-1; i>0 ; i--){
			System.out.printf("%3d",last-i+1);
			System.out.print(" ");
			//System.out.print(last-i);	
		}
		
		/*
		for(int i = 1; i<value;i++){
			System.out.print("    ");
		}
		*/
		//只要日期的當前月值為給定的月份值 ,就執行迴圈體
		while(date.getMonthValue() == month){
			//格式化輸出當前日期在月份中的第幾天
			System.out.printf("%3d",date.getDayOfMonth());
			//當前月份日期與,給定的日期相等時,則在後面加上*
			if(date.getDayOfMonth() == today){
				System.out.print("*");
			}else{
				System.out.print(" ");
			}
			//每列印一個日期後,則把當前日期向後移一天
			date = date.plusDays(1);
			//如果當前日期,是一個星期的星期一,則列印一個換行符。
			if(date.getDayOfWeek().getValue() == 1) System.out.println();
		}
		if(date.getDayOfWeek().getValue() != 1) System.out.println();

	}
}