Java編寫日歷表的3種方式
大家好,今天我和大家分享一下用Java編寫日歷表,我用了3種方式實(shí)現(xiàn)這一功能的。
首先我們來(lái)看看一個(gè)日歷表有什么特征。在這里我就把我電腦上的日歷表截下來(lái)分析一下
我們從上向下看:這個(gè)日歷表顯示了年份,月份,星期數(shù)即星期一到星期日,每一天對(duì)應(yīng)一個(gè)星期數(shù),天數(shù)每隔七天換一下行,當(dāng)月的總天數(shù)。還有一個(gè)就是每個(gè)月的第一天是接著上個(gè)月的最后一天的。
我們發(fā)現(xiàn)我們想要?jiǎng)?chuàng)建一個(gè)日歷表就只需要知道年份,月份和該月份的第一天是星期幾還有就是該月份的總天數(shù)就行。
年份和月份是我們自己設(shè)置要查看的年份和月份,每個(gè)月的總天數(shù)我們都是知道的,只要知道月份就能知道該月份的總天數(shù),不過(guò)2月份除外,2月份的總天數(shù)需要判斷該年是平年還是閏年。最后一個(gè)問(wèn)題就是怎么樣獲取該月份的第一天是星期幾?在上面我提到過(guò)每個(gè)月的第一天是接著上個(gè)月的最后一天的,并且1900年1月1日是星期一,我們可以把從1900年到我們指定日期的前一個(gè)月的總天數(shù)求出來(lái)對(duì)7取余,就是上一個(gè)月最后一天的星期數(shù)(也是這個(gè)月開(kāi)始前面的空格數(shù))。
我寫的第一種方式:不用Java中的類
獲取從1900年到我們指定日期的前一個(gè)月的總天數(shù)
//指定的日歷年份 public static int year; //指定的日歷月份 public static int month; //獲得總天數(shù) public static int getDaysFrom1900() { int days = 0; //統(tǒng)計(jì)從1900年到指定日歷年份的前一年的天數(shù) for (int i = 1900; i < year; i++) { days += isLeapYear(i) ? 366 : 365; } //統(tǒng)計(jì)從一月到指定日歷月份的前一個(gè)月的天數(shù) for (int i = 1; i < month; i++) { days += getDaysFromMonth(i); } return days; } //獲取指定月份的天數(shù) private static int getDaysFromMonth(int month) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 2: return isLeapYear(year) ? 29 : 28; default: return 30; } } //判斷指定年份是平年還是閏年 private static boolean isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0); }
顯示:這里用計(jì)數(shù)器來(lái)計(jì)數(shù),能計(jì)空格的數(shù)量
//顯示日歷 public static void show() { //獲取從1900年到指定月份前一個(gè)月的總天數(shù) int totalDays = getDaysFrom1900(); //獲取指定月份的天數(shù) int daysOfMonth = getDaysFromMonth(month); //獲取指定月份第一天前面的空格數(shù) int space = totalDays % 7; //計(jì)數(shù)器 int count = 0; //顯示 System.out.println("一\t二\t三\t四\t五\t六\t日"); System.out.println("=========================="); for (int i = 0; i < space; i++) { count++; System.out.print("\t"); } for (int i = 1; i <= daysOfMonth; i++) { count++; System.out.print(i + "\t"); if (count % 7 == 0) { count = 0; //換行 System.out.println(); } } }
我寫的第二種方式:使用Java中的Calendar類,Calendar類中提供了getActualMaximum(Calendar.DAY_OF_MONTH)方法來(lái)獲取指定月份的總天數(shù),我們可以利用Calendar類中的set(Calendar.DAY_OF_MONTH, 1)方法把日期中的天數(shù)設(shè)置為當(dāng)月的第一天,然后通過(guò)get(Calendar.DAY_OF_WEEK)獲取當(dāng)月的第一天的星期數(shù)
public static void show(int y, int m) { //獲取當(dāng)前系統(tǒng)時(shí)間 Calendar c = Calendar.getInstance(); //獲取當(dāng)前的日期 int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; int day = c.get(Calendar.DAY_OF_MONTH); //設(shè)置指定的日期 c.set(Calendar.YEAR,y); c.set(Calendar.MONTH,m-1); c.set(Calendar.DAY_OF_MONTH, 1); //獲取指定月份的總天數(shù) int dayOfMonth = c.getActualMaximum(Calendar.DAY_OF_MONTH); //獲取指定月份第一天的星期 int dayOfWeek = c.get(Calendar.DAY_OF_WEEK) - 1; //顯示 System.out.println("一\t二\t三\t四\t五\t六\t日"); System.out.println("=========================="); dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek; //獲取指定月份前面的空格數(shù) int space = dayOfWeek - 1; int count = 0; for (int i = 0; i < space; i++) { count++; System.out.print("\t"); } for (int i = 1; i <= dayOfMonth; i++) { count++; //判斷是不是當(dāng)前系統(tǒng)的日期時(shí)間 String date = (y == year && m == month && i == day) ? "*" + i + "\t" : i + "\t"; System.out.print(date); if (count % 7 == 0) { count = 0; System.out.println(); } } }
我寫的第三種方式:使用Java中的LocalDate類,LocalDate類中提供了getMonth()的方法來(lái)獲取指定的月份而Month枚舉中提供了
length(boolean leapYear)的方法來(lái)獲取指定月的總天數(shù),LocalDate類中還提供了getDayOfWeek()的方法來(lái)獲取指定天數(shù)的星期數(shù)。我用LocalDate類中提供的LocalDate.of(y,m,1)把日期中的天數(shù)設(shè)置為當(dāng)月的第一天**
public static void show(int y, int m) { //獲取當(dāng)前系統(tǒng)時(shí)間 LocalDate date = LocalDate.now(); //獲取當(dāng)前的日期 int year = date.getYear(); int month = date.getMonth().getValue(); int day = date.getDayOfMonth(); //設(shè)置指定的日期 LocalDate date1 = LocalDate.of(y,m,1); //獲取指定月份的總天數(shù) int daysOfMonth = date1.getMonth() .length(y % 4 == 0 && y % 100 != 0 || y % 400 == 0); //獲取指定月份前面的空格數(shù) int space= date1.getDayOfWeek().getValue()-1; System.out.println("一\t二\t三\t四\t五\t六\t日"); System.out.println("=========================="); int count = 0; for (int i = 0; i < space; i++) { count++; System.out.print("\t"); } for (int i = 1; i <= daysOfMonth; i++) { count++; //判斷是不是當(dāng)前系統(tǒng)的日期時(shí)間 String src = (y == year && m == month && i == day) ? "*" + i + "\t" : i + "\t"; System.out.print(src); if (count % 7 == 0) { count = 0; System.out.println(); } } }
main函數(shù):第一種方式中的show()方法沒(méi)有參數(shù),因?yàn)槲以O(shè)置了成員變量來(lái)接收,下面的是第二和第三種方式的main函數(shù)。
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請(qǐng)輸入年份:"); int year = sc.nextInt(); System.out.println("請(qǐng)輸入月份:"); int month = sc.nextInt(); show(year, month); }
運(yùn)行結(jié)果:
第一種方式:
第二和第三中方式:我在顯示表的時(shí)候判斷了一下是不是當(dāng)前的系統(tǒng)日期。
總結(jié):對(duì)于日歷表的問(wèn)題,只要知道月份的第一天是星期幾還有就是該月份的總天數(shù)就能解決。第一種方式是我初學(xué)Java的解決方式、第二種方式是我學(xué)到Calendar類的解決方式、第三種方式是我學(xué)到LocalDate類的解決方式。隨著我們不斷的學(xué)習(xí)Java這門語(yǔ)言,我們的眼界就會(huì)在這個(gè)學(xué)習(xí)的過(guò)程中不斷開(kāi)闊,就會(huì)對(duì)一個(gè)問(wèn)題產(chǎn)生不同的看法,不同的解決思路。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java實(shí)現(xiàn)窗體程序顯示日歷表
- java萬(wàn)年歷,獲取該年月日歷表
- 日歷顯示讀出輸入的年月的java代碼
- Java中的Calendar日歷API用法完全解析
- Java實(shí)現(xiàn)的日歷功能完整示例
- Java實(shí)現(xiàn)簡(jiǎn)單日歷小程序 Java圖形界面小日歷開(kāi)發(fā)
- java實(shí)現(xiàn)日歷(某年的日歷,某月的日歷)用戶完全自定義
- 學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫
- JavaWeb項(xiàng)目FullCalendar日歷插件使用的示例代碼
- java獲取本月日歷表的方法
相關(guān)文章
Java 11 正式發(fā)布,這 8 個(gè)逆天新特性教你寫出更牛的代碼
美國(guó)當(dāng)?shù)貢r(shí)間9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式發(fā)布,可在生產(chǎn)環(huán)境中使用!這是自 Java 8 后的首個(gè)長(zhǎng)期支持版本2018-09-09Java 如何快速,優(yōu)雅的實(shí)現(xiàn)導(dǎo)出Excel
這篇文章主要介紹了Java 如何快速,優(yōu)雅的實(shí)現(xiàn)導(dǎo)出Excel,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03Kotlin中使用Java數(shù)據(jù)類時(shí)引發(fā)的Bug解決方式
這篇文章主要介紹了Kotlin中使用Java數(shù)據(jù)類時(shí)引發(fā)的一個(gè)Bug,本文給大家分享問(wèn)題解決方式,感興趣的朋友跟隨小編一起看看吧2023-09-09簡(jiǎn)單了解如何在spring中使用RabbitMQ
這篇文章主要介紹了簡(jiǎn)單了解如何在spring中使用RabbitMQ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12超詳細(xì)的Spring Boot入門筆記(總結(jié))
本篇文章主要介紹了超詳細(xì)的Spring Boot入門筆記(總結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Servlet關(guān)于RequestDispatcher的原理詳解
這篇文章主要介紹了Servlet關(guān)于RequestDispatcher的原理詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11spring中ApplicationListener的使用小結(jié)
ApplicationListener是spring提供的一個(gè)監(jiān)聽(tīng)器,本文主要介紹了spring中ApplicationListener的使用小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07