java实现万年历功能

时间:2021-09-27
本文章向大家介绍java实现万年历功能,主要包括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就可以得到我们想要的结果,最后将它输出就好了。

原文地址:https://www.cnblogs.com/wushuaiqi/p/15343303.html