1、打印动态日历
//控制台输入 年,月,动态显示 如下图的格式
//例如输入2020 9
//显示
// 一 二 三 四 五 六 日
// 1 2 3 4 5 6
//7 8 9 10 11 12 13
//.....
//28 29 300
/**
* 思路:1、根据年份计算是闰年还是平年,并计算这个月要打印多少天
* 2、计算1号前面需要打印多少个空格=当前 月
* 到1900年1月之前的所有天数对7取模的余数
* 3、打印空格和日期,并控制它的布局
*/
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入年份:");
int year=sc.nextInt();
System.out.print("请输入月份:");
int month=sc.nextInt();
//1、判断该年份是否为闰年
//2、计算从1900年到当前年份的月份一共多少天
int day=0;
for (int i=1900;i<year;i++){
if (isRun(i)){
day+=366;
}else {
day+=365;
}
}
for (int i=1;i<month;i++){
//获取指定月份的天数
int d=getDay(year,i);
day+=d;
}
//3、计算空格数
int k=day%7;
//4、计算这个月有多少天
int thisday=getDay(year,month);
//5、输出
System.out.println("一\t二\t三\t四\t五\t六\t日");
//5.1 先输出空格数
for (int i=0;i<k;i++){
System.out.print(" \t");
}
//5.2 输出天数
//由于 需要根据天数换行 n表示累计当前空格数和天数 是否需要换行
int n=k;
for (int i=1;i<thisday;i++){
System.out.print(i+"\t");
n++;
if (n%7==0){
System.out.println();
}
}
}
/**
* 判断是否是闰年
* @param year 年份
* @return Boolean
*/
public static boolean isRun(int year){
if(year%4==0 && year%100!=0 || year%400==0){
return true;
}
return false;
}
/**
* 根据年份,月份判断这个月的天数
* @param year
* @param month
* @return
*/
public static 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:
if (isRun(year)){
day+=29;
}else {
day+=28;
}
break;
}
return day;
}