java:通過LocalDate實現日曆效果
阿新 • • 發佈:2019-02-02
看書《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(); } }