1 public class Demo {
2 public static void main(String[] args) {
3 int totalDay=0; //计算总天数
4 int dayOfWeek; //保存当月第一天是星期几
5 //int day=0 ; //当月的天数
6 int dayOfYear=0; //保存用户输入的年月之前的天数
7 int sum = 0;
8 Scanner sc = new Scanner(System.in);
9 System.out.println("******************欢 迎 使 用 万 年 表******************");
10 System.out.println("请选择年份:");
11 int year = sc.nextInt();
12 System.out.println("请选择月份:");
13 int month = sc.nextInt();
14 //计算用户当年1-1后总天数
15 for(int i = 1900; i <year; i++){
16 if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0){
17 dayOfYear += 366;
18 }
19 else {
20 dayOfYear += 365;
21 }
22 }
23 int[] day = {31,28,31,30,31,30,31,31,30,31,30,31}; //当年的月
24 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
25 day[1] = 29;
26 }
27 for (int i = 0; i < month-1; i++){
28 sum += day[i];
29 }
30 dayOfWeek = ((dayOfYear + sum) + 1) % 7;//核心:算法 求该月的1号是星期几 (当用户输入的年份1-1 以前的所有天数+该月的天数 +1) %7
31 //打印格式
32 System.out.println("天\t一\t二\t三\t四\t五\t六");
33 //初始化日历的第一天的位置
34 for (int i = 0; i < dayOfWeek; i++){
35 System.out.print("\t");
36 }
37
38 for(int i = 1; i <= day[month-1]; i++){
39 //控制每到星期6就换行,原理为总天数加上当月天数对7取余
40 if (((dayOfYear + sum)+i) % 7 ==6 ){
41 System.out.print(i+"\n");
42 }
43 else {
44 System.out.print(i+"\t");
45 }
46 }
47 }
48 }