1 import java.util.Scanner; 2 3 /** 4 * @author 海綿擺擺嘉心糖 5 * @Classname Calendar 6 * @Description 萬年歷的效果實現,定義的初始月份為2001年一月1日 星期一 7 * @Date 2021/9/24 9:53 8 */ 9 public class Calendar { 10 11 static Scanner sc = new Scanner(System.in); 12 static boolean tf; 13 14 public static void main(String[] args) { 15 System.out.println("請輸入你想要查看的年份:"); 16 int year = sc.nextInt(); 17 System.out.println("請輸入你想要查詢的月份:"); 18 int month = sc.nextInt(); 19 tf = (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)); 20 // 接收定義年到指定年的天數數據 21 int years = yearNumber(year); 22 // 接收一月1日到指定月的天數數據 23 int months = monthNumber(month); 24 sc.close(); 25 // 計算2001年之前某年某月的第一天是星期幾 26 if (year < 2001){years = 6 - (years % 7);} 27 // 將年天數和月天數相加得到2001年到指定年月的天數 28 int numbers = years + months; 29 // 輸出上面的星期數 30 week(); 31 System.out.println(); 32 // 輸出日歷數字 33 printNumber(numbers, month); 34 } 35 36 /** 37 * 輸出日期號碼,指定在星期幾開始輸出1號 38 */ 39 private static void printNumber(int numbers, int month) { 40 switch (month) { 41 case 1: 42 case 3: 43 case 5: 44 case 7: 45 case 8: 46 case 10: 47 case 12: 48 // 計算在星期幾開始輸出1號 49 for (int i = 0; i < (numbers % 7); i++) { 50 System.out.print("\t"); 51 System.out.print("\t"); 52 } 53 for (int i = 1; i <= 31; i++) { 54 System.out.print("\t"); 55 if (i < 10){System.out.print("0");} 56 System.out.print(i); 57 System.out.print("\t"); 58 if (((numbers + i) % 7) == 0){System.out.println();} 59 } 60 break; 61 case 2: 62 for (int k = 0; k < (numbers % 7); k++) { 63 System.out.print("\t"); 64 System.out.print("\t"); 65 } 66 int number = 28; 67 int k = 1; 68 if (tf){number += 1;} 69 while (k < number){ 70 System.out.print("\t"); 71 if (k < 10){System.out.print("0");} 72 System.out.print(k); 73 System.out.print("\t"); 74 if (((numbers + k) % 7) == 0){System.out.println();} 75 k++; 76 } 77 break; 78 case 4: 79 case 6: 80 case 9: 81 case 11: 82 for (int j = 0; j < (numbers % 7); j++) { 83 System.out.print("\t"); 84 System.out.print("\t"); 85 } 86 for (int j = 1; j < 30; j++) { 87 System.out.print("\t"); 88 if (j < 10){System.out.print("0");} 89 System.out.print(j); 90 System.out.print("\t"); 91 if (((numbers + j) % 7) == 0){System.out.println();} 92 } 93 break; 94 default:break; 95 } 96 } 97 98 /** 99 * 此方法是用來計算輸入年的一月1日到輸入月的1日的天數 100 * @return number 101 */ 102 private static int monthNumber(int month) { 103 int number = 0; 104 for (int i = 1; i < month; i++) { 105 number += 30; 106 switch (i){ 107 case 1: 108 case 3: 109 case 5: 110 case 7: 111 case 8: 112 case 10: 113 case 12: 114 number += 1; 115 break; 116 case 2: 117 if (tf){ 118 number -= 1; 119 }else { 120 number -= 2; 121 } 122 break; 123 default:break; 124 } 125 } 126 return number; 127 } 128 129 /** 130 * 此方法是用來計算輸入年份的一月1號到定義的初始年份的一月1號的天數 131 * @return number of years 132 */ 133 private static int yearNumber(int year) { 134 int number = 0; 135 if (year > 2001){ 136 for (int i = 2001; i < year; i++) { 137 number += 365; 138 if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)){number += 1;} 139 } 140 }else { 141 for (int i = 2001; i > year; i--) { 142 number += 365; 143 if (((i % 4 ==0) && (i % 100 != 0)) || (i % 400 == 0)){number += 1;} 144 } 145 } 146 return number; 147 } 148 149 /** 150 * 輸出上方星期 151 */ 152 private static void week() { 153 String[] weeks = new String[] {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"}; 154 for (String week : weeks) { 155 System.out.print(week); 156 System.out.print("\t"); 157 } 158 } 159 }
這里我定義的是2001年的一月1號,這一天是星期一,這樣為了后面的計算做准備。
然后從控制台獲取客戶想要查詢的年份和月份,這樣我們就可以計算出他要查詢的那一個月的1號是星期幾了,這樣我們就可以控制當月1號在星期幾開始輸出;
計算我們初始定義的年份到要查詢的年份的月份的天數,分兩步計算,先計算2001年的1月1日到查詢年的1月1日有多少天,然后計算查詢年的1月1日到查詢月的1日有幾天,將兩個數據相加余7就可以得到我們想要的結果。
然后要向前推算的話,用余7來計算的話就會出錯,因為這樣推過去是要反着推,所以就先計算出2001年1月1日到所要查詢的那一年的1月1日的天數,然后將它余7,再用6減去這個余數,最后用這個余數加上這一年1月1日到要查詢的那一個月的1號余7就可以得到我們想要的結果,最后將它輸出就好了。