Java利用LocalDate類實(shí)現(xiàn)日歷設(shè)計(jì)
前言
在我們完成這個日歷設(shè)計(jì)前,需要了解Java中的預(yù)定義類LocalDate的一些用法
語法
LocalDate.now() // 2022-07-01
會構(gòu)造一個新對象,表示構(gòu)造這個對象時(shí)的日期。
LocalDate.of(1999, 1, 1)
可以提供年、月和日來構(gòu)造對應(yīng)一個特定日期的對象:
當(dāng)然,通常我們都希望將構(gòu)造的對象保存在一個對象變量中:
LocalDate newYearsEve = LocalDate.of(1999, 1, 1);
當(dāng)有了一個LocalDate對象,可以用方法getYear、getMonthValue和getDayOfMonth得到年、月和日:
int year = newYearsEve.getYear(); // 1999 int month = newYearsEve.getMonthValue(); // 1 int day = newYeaersEve.getDayOfMonth(); // 1
上面的方法看起來沒什么意義,因?yàn)檫@正是構(gòu)造對象時(shí)使用的那些值。不過,有時(shí)可能有一個計(jì)算得到的日期,然后你希望調(diào)用這些方法來了解它的更多信息。例如,plusDays方法會得到一個新的LocalDate,如果把應(yīng)用這個方法的對象稱為當(dāng)前對象,這個新日期對象則是距當(dāng)前對象指定天數(shù)的一個新日期:
LocalDate aThousandDaysLater = newYearsEve.plusDays(1000); year = aThousandDaysLater.getYear(); // 2002 month = aThousandDaysLater.getMonthValue(); // 09 day = aThousandDaysLater.getDayOfMonth(); // 26
aThousandDaysLater是在原來的日期上加了1000天,這時(shí)使用上面的方法就有效了
日歷實(shí)戰(zhàn)
需求:使用LocalDate類展示當(dāng)前月的日歷,格式如下:
Mon Tue Wed Thu Fri Sat Sun
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
當(dāng)前日期使用*號標(biāo)記??梢钥吹?,這個程序需要知道如何計(jì)算某月份的天數(shù)以及一個給定日期相應(yīng)是星期幾。
步驟分解
①先構(gòu)造一個對象,并用當(dāng)前的日期初始化
`LocalDate date = LocalDate.now();`
②獲取當(dāng)前的月份和日期
int month = date.getMonthValue(); int today = date.getDayOfMonth();
③將date設(shè)置為這個月的第一天,并得到這一天為星期幾
date = date.minusDays(today - 1); // 設(shè)置為當(dāng)月的第一天 DayOfWeek weekday = date.getDayOfWeek(); int value = weekday.getValue(); // 1 = Monday 7 = Sunday
變量weekday設(shè)置為DayOfWeek類型的對象。我們調(diào)用這個對象的getValue方法來得到星期幾的一個數(shù)值。我們會得到一個整數(shù)。星期一就返回1,星期二就返回2,依次類推,星期日就返回7.
④由于日歷的第一行是縮進(jìn)的,這樣可使月份的第一天指向相應(yīng)的星期幾。下面代碼會打印表頭和第一行的縮進(jìn)
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for (int i = 1; i < value; i++)
System.out.print(" ");⑤打印日歷的主體,進(jìn)入一個循環(huán),其中date遍歷一個月中的每一天。
每次迭代時(shí),打印日期值。如果date是當(dāng)前日期,這個日期則用一個*標(biāo)記。接下來,把date推進(jìn)到下一天。如果到達(dá)新的一周的第一天,則換行打?。?/p>
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();
}⑥什么時(shí)候結(jié)束呢?我們不知道這個月有幾天,是28、29、30還是31。實(shí)際上,只要date還在當(dāng)月就要繼續(xù)迭代
完整代碼
import java.time.DayOfWeek;
import java.time.LocalDate;
/**
* @author JKC
* @Description:
* @date 2022/7/1 10:53
*/
public class 制作日歷 {
public static void main(String[] args) {
// 創(chuàng)建一個日期對象,并進(jìn)行初始化
LocalDate date = LocalDate.now();
System.out.println(date);
// 獲取當(dāng)前月份和日期
int month = date.getMonthValue();
int today = date.getDayOfMonth();
// 將date設(shè)置為這個月的第一天,并得到這一天為星期幾
date = date.minusDays(today - 1);
// 設(shè)置為DayOfWeek類型的對象。調(diào)用這個對象的getValue方法來得到星期幾的一個數(shù)值
DayOfWeek weekday = date.getDayOfWeek();
int value = weekday.getValue(); // 1 = Monday 7 = Sunday
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();
}
}結(jié)論
上面的示例程序的重點(diǎn)是展示如何使用一個類的接口完成相當(dāng)復(fù)雜的任務(wù),而無須了解實(shí)現(xiàn)細(xì)節(jié)
LocalDate API
static LocalDate now() //構(gòu)造一個表示當(dāng)前日期的對象 static LocalDate of(int year, int month, int day) //構(gòu)造一個表示給定日期的對象 int getYear() int getMonthValue() int getDayOfMonth() //得到當(dāng)前日期的年、月和日。 DayOfWeek getDayOfWeek //得到當(dāng)前日期是星期幾,作為DayOfWeek類的一個實(shí)例返回。調(diào)用getValue來得到1~7之間的一個數(shù),表示這是星期幾,1表示星期一,7表示星期日 LocalDate plusDays(int n) LocalDate minusDays(int n) //生成當(dāng)前日期之后或之前n天的日期
到此這篇關(guān)于Java利用LocalDate類實(shí)現(xiàn)日歷設(shè)計(jì)的文章就介紹到這了,更多相關(guān)Java LocalDate日歷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡單了解Java刪除字符replaceFirst原理及實(shí)例
這篇文章主要介紹了簡單了解Java刪除字符replaceFirst原理及實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
解決springboot文件配置端口不起作用(默認(rèn)8080)
Springboot通過url訪問本地圖片代碼實(shí)例
多個springboot項(xiàng)目如何使用一個外部共同的application.yml
為什么rest接口返回json建議采用下劃線形式,不要用駝峰
mybatis-plus用insertBatchSomeColumn方法批量新增指定字段
Eureka源碼閱讀解析Server服務(wù)端啟動流程實(shí)例

