/**
* @author 石乐志
* 打印万年历
*/
public class Demo1 {
public static void main(String[] args) {
//调用 Days的printDays() 打印日期的方法
Days.printDays(2017,2018);
}
}
class Days {
public static int getDays(int year, int month) {
//计算每个月的天数
int days = 1;
switch (month) {
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 2:
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
days = 29;
} else {
days = 28;
}
break;
}
return days;
}
public static int dayCount(int year, int month) {
/*
* 计算每个月1号是第多少天
* 调用了getDays(int year, int month)方法
* */
int dayCount = 1;
for (int i = 1; i < month; i++) {
//从1号开始,1月1号是1年的第1天,dayCount=1;12月1号是前11个月+1天
int days = getDays(year, i);
dayCount += days;
}
return dayCount;
}
public static int Week(int year, int month) {
/*
* 计算每个月1号是星期几
* 调用了 dayCount(int year, int month)方法
* */
int dayCount = dayCount(year, month);
//调用dayCount()方法,计算当前月份1号是一年的第多少天
int week = (year - 1 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + dayCount) % 7;
return week;
}
/**
*
* @param year1 起始年份
* @param year2 终止年份
*/
public static void printDays(int year1, int year2) {
/*
* 打印日期
* 调用了getDays(int year, int month)方法
* 调用了 Week(int year, int month)方法
* */
for (int i = year1; i < year2; i++) {
//遍历从1970~2050之间的年份
for (int j = 1; j <= 12; j++) {
System.out.println("\t" + "\t " + i + "年" + j + "月");
//打印 某年某月
System.out.println(
"日" + "\t" + "一" + "\t" + "二" + "\t" + "三" + "\t" + "四" + "\t" + "五" + "\t" + "六" + "\t");
//打印星期
int days = getDays(i, j);
//调用getDays(int year, int month)方法, 获取当月的天数
int week = Week(i, j);
//调用Week(int year, int month)方法, 获取当月1号是周几
int n = 0;// 计算打印空格的次数
for (int m = 0; m < week; m++) {
if (week == 7) {
//周天是不用打印空格的,直接终止循环
break;
}
//周几,前面就要打印几个空格
System.out.print("\t");
n++;// 计算打印空格的次数
}
for (int k = 1; k <= days; k++) {
System.out.print(k + "\t");
if ((k + n) % 7 == 0) {
//每打印7次换行, 空格也要计算
System.out.println();
}
}
System.out.println();
}
}
}
}