用Java编写日历表(3种方式)
大家好,今天我和大家分享一下用Java編寫日歷表,我用了3種方式實現這一功能的。
首先我們來看看一個日歷表有什么特征。在這里我就把我電腦上的日歷表截下來分析一下
?
我們從上向下看:這個日歷表顯示了年份,月份,星期數即星期一到星期日,每一天對應一個星期數,天數每隔七天換一下行,當月的總天數。還有一個就是每個月的第一天是接著上個月的最后一天的。
我們發現我們想要創建一個日歷表就只需要知道年份,月份和該月份的第一天是星期幾還有就是該月份的總天數就行。
年份和月份是我們自己設置要查看的年份和月份,每個月的總天數我們都是知道的,只要知道月份就能知道該月份的總天數,不過2月份除外,2月份的總天數需要判斷該年是平年還是閏年。最后一個問題就是怎么樣獲取該月份的第一天是星期幾?在上面我提到過每個月的第一天是接著上個月的最后一天的,并且1900年1月1日是星期一,我們可以把從1900年到我們指定日期的前一個月的總天數求出來對7取余,就是上一個月最后一天的星期數(也是這個月開始前面的空格數)。
我寫的第一種方式:不用Java中的類,
獲取從1900年到我們指定日期的前一個月的總天數
//指定的日歷年份public static int year;//指定的日歷月份public static int month; ?//獲得總天數public static int getDaysFrom1900() {int days = 0;//統計從1900年到指定日歷年份的前一年的天數for (int i = 1900; i < year; i++) {days += isLeapYear(i) ? 366 : 365;}//統計從一月到指定日歷月份的前一個月的天數for (int i = 1; i < month; i++) {days += getDaysFromMonth(i);}return days;}//獲取指定月份的天數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);} ?顯示:這里用計數器來計數,能計空格的數量
? //顯示日歷public static void show() {//獲取從1900年到指定月份前一個月的總天數int totalDays = getDaysFrom1900();//獲取指定月份的天數int daysOfMonth = getDaysFromMonth(month);//獲取指定月份第一天前面的空格數int space = totalDays % 7;//計數器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)方法來獲取指定月份的總天數,我們可以利用Calendar類中的set(Calendar.DAY_OF_MONTH, 1)方法把日期中的天數設置為當月的第一天,然后通過get(Calendar.DAY_OF_WEEK)獲取當月的第一天的星期數
public static void show(int y, int m) {//獲取當前系統時間Calendar c = Calendar.getInstance();//獲取當前的日期int year = c.get(Calendar.YEAR);int month = c.get(Calendar.MONTH) + 1;int day = c.get(Calendar.DAY_OF_MONTH);//設置指定的日期c.set(Calendar.YEAR,y);c.set(Calendar.MONTH,m-1);c.set(Calendar.DAY_OF_MONTH, 1);//獲取指定月份的總天數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;//獲取指定月份前面的空格數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++;//判斷是不是當前系統的日期時間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()的方法來獲取指定的月份而Month枚舉中提供了
length(boolean leapYear)的方法來獲取指定月的總天數,LocalDate類中還提供了getDayOfWeek()的方法來獲取指定天數的星期數。我用LocalDate類中提供的LocalDate.of(y,m,1)把日期中的天數設置為當月的第一天**
public static void show(int y, int m) {//獲取當前系統時間LocalDate date = LocalDate.now();//獲取當前的日期int year = date.getYear();int month = date.getMonth().getValue();int day = date.getDayOfMonth();//設置指定的日期LocalDate date1 = LocalDate.of(y,m,1);//獲取指定月份的總天數int daysOfMonth = date1.getMonth().length(y % 4 == 0 && y % 100 != 0 || y % 400 == 0);//獲取指定月份前面的空格數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++;//判斷是不是當前系統的日期時間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函數:第一種方式中的show()方法沒有參數,因為我設置了成員變量來接收,下面的是第二和第三種方式的main函數。
public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請輸入年份:");int year = sc.nextInt();System.out.println("請輸入月份:");int month = sc.nextInt();show(year, month);}運行結果:
第一種方式:
?第二和第三中方式:我在顯示表的時候判斷了一下是不是當前的系統日期。
?
總結:對于日歷表的問題,只要知道月份的第一天是星期幾還有就是該月份的總天數就能解決。第一種方式是我初學Java的解決方式、第二種方式是我學到Calendar類的解決方式、第三種方式是我學到LocalDate類的解決方式。隨著我們不斷的學習Java這門語言,我們的眼界就會在這個學習的過程中不斷開闊,就會對一個問題產生不同的看法,不同的解決思路。
總結
以上是生活随笔為你收集整理的用Java编写日历表(3种方式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python模糊神经网络预测_MATLA
- 下一篇: 就在今天!当当科技品类日满100减50