java實現萬年歷功能


  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就可以得到我們想要的結果,最后將它輸出就好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM