import java.util.Scanner;
public class Calendar {
static Scanner sc = new Scanner(System.in);
static boolean tf;
public static void main(String[] args) {
System.out.println("请输入你想要查看的年份:");
int year = sc.nextInt();
System.out.println("请输入你想要查询的月份:");
int month = sc.nextInt();
tf = (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
// 接收定义年到指定年的天数数据
int years = yearNumber(year);
// 接收一月1日到指定月的天数数据
int months = monthNumber(month);
sc.close();
// 计算2001年之前某年某月的第一天是星期几
if (year < 2001){years = 6 - (years % 7);}
// 将年天数和月天数相加得到2001年到指定年月的天数
int numbers = years + months;
// 输出上面的星期数
week();
System.out.println();
// 输出日历数字
printNumber(numbers, month);
}
private static void printNumber(int numbers, int month) {
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
// 计算在星期几开始输出1号
for (int i = 0; i < (numbers % 7); i++) {
System.out.print("t");
System.out.print("t");
}
for (int i = 1; i <= 31; i++) {
System.out.print("t");
if (i < 10){System.out.print("0");}
System.out.print(i);
System.out.print("t");
if (((numbers + i) % 7) == 0){System.out.println();}
}
break;
case 2:
for (int k = 0; k < (numbers % 7); k++) {
System.out.print("t");
System.out.print("t");
}
int number = 28;
int k = 1;
if (tf){number += 1;}
while (k < number){
System.out.print("t");
if (k < 10){System.out.print("0");}
System.out.print(k);
System.out.print("t");
if (((numbers + k) % 7) == 0){System.out.println();}
k++;
}
break;
case 4:
case 6:
case 9:
case 11:
for (int j = 0; j < (numbers % 7); j++) {
System.out.print("t");
System.out.print("t");
}
for (int j = 1; j < 30; j++) {
System.out.print("t");
if (j < 10){System.out.print("0");}
System.out.print(j);
System.out.print("t");
if (((numbers + j) % 7) == 0){System.out.println();}
}
break;
default:break;
}
}
private static int monthNumber(int month) {
int number = 0;
for (int i = 1; i < month; i++) {
number += 30;
switch (i){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
number += 1;
break;
case 2:
if (tf){
number -= 1;
}else {
number -= 2;
}
break;
default:break;
}
}
return number;
}
private static int yearNumber(int year) {
int number = 0;
if (year > 2001){
for (int i = 2001; i < year; i++) {
number += 365;
if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)){number += 1;}
}
}else {
for (int i = 2001; i > year; i--) {
number += 365;
if (((i % 4 ==0) && (i % 100 != 0)) || (i % 400 == 0)){number += 1;}
}
}
return number;
}
private static void week() {
String[] weeks = new String[] {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
for (String week : weeks) {
System.out.print(week);
System.out.print("t");
}
}
}
这里我定义的是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就可以得到我们想要的结果,最后将它输出就好了。



