1 package codeTask_FangFa; 2 // 5.34 使用zeller公式,打印某年某月的日历信息。 3 import java.util.Scanner; 4 public class PrintRiLi { 5 public static void main(String[] args){ 6 Scanner input = new Scanner(System.in); 7 System.out.println("请输入需要打印日历的年份:"); 8 int year = input.nextInt(); 9 System.out.println("请输入需要打印日历的月份:"); 10 int month = input.nextInt(); 11 printTitle(year,month); 12 printBody(year,month); 13 14 } 15 16 public static void printTitle(int year,int month){ //第二战场--头 17 System.out.println(" 日 历"); 18 System.out.println(" "+getMonth(month)+" "+year); 19 System.out.println(" 星期日 星期一 星期二 星期三 星期四 星期五 星期六"); 20 System.out.println("--------------------------------------------------"); 21 } 22 23 public static String getMonth(int month){ // 这就不说啥了 24 25 switch(month){ 26 case 1:return "一月"; 27 case 2:return "二月"; 28 case 3:return "三月"; 29 case 4:return "四月"; 30 case 5:return "五月"; 31 case 6:return "六月"; 32 case 7:return "七月"; 33 case 8:return "八月"; 34 case 9:return "九月"; 35 case 10:return "十月"; 36 case 11:return "十一月"; 37 case 12:return "十二月"; 38 } 39 System.out.println("输入的月份出错,程序退出!"); 40 System.exit(0); 41 return "-1"; 42 } 43 44 public static void printBody(int year,int month){ //主战场--可要看仔细了。 45 int count = getXingQi(year,month); 46 int nim = getNumberInMonth(year,month); // nim 全拼是 number in month. 47 int day = 1; //每月的日子,从 1 开始。 48 switch (count){ 49 case 0 : count = 1;break; 50 case 1 : count = 2;break; 51 case 2 : count = 3;break; 52 case 3 : count = 4;break; 53 case 4 : count = 5;break; 54 case 5 : count = 6;break; 55 case 6 : count = 7;break; 56 } 57 for(int i =1;i<count;i++){ 58 System.out.printf("%7s"," "); 59 } 60 while(day<nim){ 61 62 while(count%7!=0){ 63 System.out.printf("%7d",day); 64 if(day==nim) 65 System.exit(0); 66 count++; 67 day++; 68 69 } 70 System.out.printf("%7d\n",day); 71 count++; 72 day++; 73 74 } 75 76 } 77 78 79 public static int getXingQi(int year,int month){ //得到某月1号是星期几。 这里会用到zeller公式。 80 int m = month; 81 if(month == 1){ 82 m = 13; 83 year--; 84 } 85 else if(month ==2){ 86 m = 14; 87 year--; 88 } 89 int d = 1; 90 int c = year/100; 91 int y = year%100; 92 int w1 = y+y/4+c/4-2*c+26*(m+1)/10+d-1; 93 int w = (w1%7+7)%7; 94 return w ; 95 } 96 97 public static int getNumberInMonth(int year,int month){ //返回某月共有几天。 98 if(isRunNian(year)){ 99 switch (month){ 100 case 1 : return 31; 101 case 2 : return 29 ; 102 case 3 : return 31 ; 103 case 4 : return 30 ; 104 case 5 : return 31 ; 105 case 6 : return 30 ; 106 case 7 : return 31 ; 107 case 8 : return 31 ; 108 case 9 : return 30 ; 109 case 10 : return 31 ; 110 case 11: return 30 ; 111 case 12 : return 31 ; 112 } 113 } 114 else{ 115 switch (month){ 116 case 1 : return 31; 117 case 2 : return 28 ; 118 case 3 : return 31 ; 119 case 4 : return 30 ; 120 case 5 : return 31 ; 121 case 6 : return 30 ; 122 case 7 : return 31 ; 123 case 8 : return 31 ; 124 case 9 : return 30 ; 125 case 10 : return 31 ; 126 case 11: return 30 ; 127 case 12 : return 31 ; 128 } 129 } 130 return -1; //错误情况下的返回值。 131 } 132 133 public static boolean isRunNian(int year){ //判断闰年。是就true 134 if(year%400==0||(year%4==0&year%100!=0)) 135 return true; 136 return false; 137 } 138 }