/*
案例要求:根据用户输入的年份和月份,打印出当前月的月历
分析:
1.写出方法,实现判断是否是闰年
2.写出方法,计算某一个月的天数
3.写出方法,计算当前的月份,距离1900年1月1日的总共天数
(前提:已知1900年1月1日,是星期一)
4.明白一个月的第一天是周几,因此要写出方法,求出月历前面需要空的格数
1号是星期几,前面就空几格
*/
import java.util.Scanner;
public class ChineseCalendar {
public static void main(String[] args) {
//创建一个Scanner对象
Scanner sc = new Scanner(System.in);
//从键盘输入年月
System.out.println("请输入年份,格式为:yyyy");
int year = sc.nextInt();
System.out.println("请输入月份,格式为:MM");
int month = sc.nextInt();
//调用方法,打印月历
printCalendar(year, month);
}
/**
* 根据所输的年月打印万年历
* @param year 所输的年份
* @param month 所输的月份
*/
public static void printCalendar(int year, int month) {
//打印表头
System.out.println("-----" + year + "年" + month + "月日历为-----");
System.out.println("周日\t周一\t周二\t周三\t周四\t周五\t周六");
//打印当月1号前需要空出的位置
int kongGe = getKongGeCount(year, month); //空格的数量
for (int i = 1; i <= kongGe; i++) {
System.out.print(" \t");
}
//打印月中的数字
int day = getDaysOfMonth(year, month); //当月天数
for (int i = 1; i <= day; i++) {
System.out.print(i + "\t");
//如果一行排满,就换行
if ((i + kongGe) % 7 == 0) {
System.out.println();
}
}
}
/**
* 求所输月份的第一天前面所空的格数
* @param year 所输的年份
* @param month 所输的月份
* @return
*/
public static int getKongGeCount(int year, int month) {
//所输月份的第一天是星期几,前面就空几格
int count = getTotalDays(year, month) % 7 + 1;
//如果空格数为7,将其置为0
if (count == 7) {
count = 0;
}
return count;
}
/**
* 当月的1号,距离1900年1月1号的总天数
* @param year 所输的年份
* @param month 所输的月份
* @return
*/
public static int getTotalDays(int year, int month) {
int sumDays = 0; //总天数
//先求所有年的天数总和
for (int i = 1900; i < year; i++) {
sumDays += isLeapYear(i) ? 366 : 365;
}
//再求当年所输月份之前的总天数
for (int i = 1; i < month; i++) {
sumDays += getDaysOfMonth(year, i);
}
return sumDays;
}
/**
* 计算某月份的天数
* @param year 年份
* @param month 月份
* @return
*/
public static int getDaysOfMonth(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;
break;
}
return day;
}
/**
* 判断是否是闰年
* @param year 年份
* @return
*/
public static boolean isLeapYear(int year) {
//能被4整除但不能被100整除,或则能被400整除的年份都是闰年
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
return true;
}
else {
return false;
}
}
}