import java.util.Scanner;
public class MyCalendar {
//判断润平年的方法
public boolean isLeapYear(int year){
if((year%4==0&&year%100!=0) || year%400==0){
return true;
}else{
return false;
}
}
//根据年份和月份来判断每月的天数
public int getDay(int year,int month){
int day = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
// day = isLeapYear(year)?29:28;
boolean boo = isLeapYear(year);
if(boo){
day = 29;
}else{
day = 28;
}
break;
default:
System.out.println("骚年,你输入的月份有误");
break;
}
return day;
}
//计算从1900.1.1一直到用户输入的年份和月份之间的总天数(不包括当前年和当前月)
public int totalDay(int year,int month){
int total = 0;
//循环计算整年的天数和 例如用户输入的是2019年,则整年的就从1900~2018
for(int i=1900;i<year;i++){
if(isLeapYear(i)){
total += 366;//闰年366天
}else{
total += 365;//平年365天
}
}
/*
* 循环计算月的天数 例如用户输入的是2019年的6月,那么前面一个循环只是计算到了
* 2018年12月31号的总天数,下面就是要循环2019年1月1号到5月31号的总天数
*/
for(int i=1;i<month;i++){
total += getDay(year, i);
}
return total;
}
//打印日历的方法
public void printInfo(int year,int month){
System.out.println("一\t二\t三\t四\t五\t六\t日");
int count = 0;//计数器,用来记录打印了多少次
//从1900.1.1到用户输入的月的前一个月的最后一天打印空格
//获取到用户输入的月的前一个月的总天数
int total = totalDay(year,month)%7;
for(int i=1;i<=total;i++){
System.out.print("\t");
count++;
if(count%7 == 0){//换行
System.out.print("\n");
}
}
//获取当月的天数
int day = getDay(year, month);
//循环打印当月的日历
for(int i=1;i<=day;i++){
System.out.print(i+"\t");
count++;
if(count%7==0){//换行
System.out.println();
}
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入年:");
int year = scan.nextInt();
System.out.println("输入月:");
int month = scan.nextInt();
//创建对象
new MyCalendar().printInfo(year, month);
}
}