作业⼆:
设计⼀个万年历
要求从键盘输⼊⼀个年份和⽉份,能够打印该⽉份从详细⽇历
提示:1900年的1⽉1⽇为星期⼀。
package calendar;
import java.util.Scanner;
/**
* 根据用户输入的年份和月份完成当月日历的绘制
*
* @author GXC
*
*/
public class Calendar {
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();
draw(year, month);
}
/**
* 计算所输入年月的天数
*
* @param year 用户所输入的年份
* @param month 用户所输入的月份
* @return 所输入月份的天数
*/
public static int dayOfThisYearMonth(int year, int month) {
int monthDay = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
monthDay = 31;
break;
case 4:
case 6:
case 9:
case 11:
monthDay = 30;
break;
case 2:
if (isLeapyear(2020)) {
monthDay = 29;
} else {
monthDay = 28;
}
}
return monthDay;
}
/**
* 绘制日历
*
* @param year 用户输入的年份
* @param month 用户输入的月份
*/
public static void draw(int year, int month) {
int days = daysCount(year, month);
int monthDay = dayOfThisYearMonth(year, month);
int weekDay = (days) % 7;
String[] arr = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
for (int i = 0; i < 7; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
for (int i = 0; i < weekDay + 1; i++) {
System.out.print("" + "\t");
}
int count = 1;
for (int i = weekDay + 1; i < 7; i++) {
System.out.print(count + "\t");
count++;
}
System.out.println();
flag: while (count <= monthDay) {
for (int i = 0; i < 7; i++) {
System.out.print(count++ + "\t");
if ((monthDay + 1) == count) {
break flag;
}
}
System.out.println();
}
}
/**
* 计算1900年至用户所输入月份的上一月份总天数
*
* @param year 用户输入的年份
* @param month 用户输入的月份
* @return 总天数
*/
public static int daysCount(int year, int month) {
int leapYear = 0;
for (int i = 1900; i < year; i++) {
if (isLeapyear(i)) {
leapYear++;
}
}
int thisYearDay = monthDay(year, month);
return 366 * leapYear + (year - leapYear - 1900) * 365 + thisYearDay;
}
/**
* 判断年份是否为闰年
*
* @param year
* @return
*/
public static boolean isLeapyear(int year) {
return (year % 4 == 0 & year % 100 != 0) || (year % 400 == 0) ? true : false;
}
/**
* 判断所输入年份的月份之前的总天数
*
* @param year
* @param month
* @return
*/
public static int monthDay(int year, int month) {
boolean leapMonth = isLeapyear(year);
int leapMonthDay = 28;
int thisYearDay = 0;
if (leapMonth) {
leapMonthDay = 29;
}
switch (month) {
case 1:
thisYearDay = 0;
break;
case 2:
thisYearDay = 31;
break;
case 3:
thisYearDay = leapMonthDay + 31;
break;
case 4:
thisYearDay = leapMonthDay + 62;
break;
case 5:
thisYearDay = leapMonthDay + 92;
break;
case 6:
thisYearDay = leapMonthDay + 123;
break;
case 7:
thisYearDay = leapMonthDay + 153;
break;
case 8:
thisYearDay = leapMonthDay + 184;
break;
case 9:
thisYearDay = leapMonthDay + 215;
break;
case 10:
thisYearDay = leapMonthDay + 245;
break;
case 11:
thisYearDay = leapMonthDay + 276;
break;
case 12:
thisYearDay = leapMonthDay + 306;
break;
}
return thisYearDay;
}
}