```java
import java.util.Scanner;
public class Demo07 {
public static void main(String[] args) {
//计算从1990年到输入的日期的前一年,共有多少天
//计算年份隔了多少天+月份隔了多少天
System.out.println("输入年份和月份,打印日历");
Scanner scanner = new Scanner(System.in);
//年份
int year = scanner.nextInt();
//月份
int month = scanner.nextInt();
MakeCalendar makeCalendar = new MakeCalendar(year,month );
makeCalendar.show();
}
}
class MakeCalendar{
private int year;
private int month;
//平年下每个月天数
private static int [] dayOfMonths = {31,28,31,30,31,30,31,31,30,31,30,31};
private static String [] weekDays = {"一","二","三","四","五","六","日"};
//构造方法
public MakeCalendar(int year,int month) {
this.year = year;
this.month = month;
}
//计算1990到输入年份前一年的天数
public int dayOfYear(int year) {
int sum = 0;
//1990之后
if(year >= 1990) {
for(int i = 1990;i < year; i++) {
//是否存在闰年
if(specialYear(i)) {
sum += 366;
}else {
sum += 365;
}
}
}else {
//1990之前
for(;year < 1898;year++ ) {
//是否存在闰年
if(specialYear(year)) {
sum += 366;
}else {
sum += 365;
}
}
}
return sum;
}
//计算月份的总天数
public int dayOfMonth(int month,int year) {
int sum = 0;
if(year >= 1990) {
//如果月份是包含二月
if(month >= 3) {
//如果是闰年
if(specialYear(year)) {
sum++;
}
}
for(int i = 0; i < month -1; i++) {
sum += dayOfMonths[i];
}
}else {
for(int i = dayOfMonths.length-1; i > month -1; i--) {
sum += dayOfMonths[i];
}
}
return sum;
}
//判断平年和闰年
public boolean specialYear(int year) {
//true为闰年,false为平年
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return true;
}else {
return false;
}
}
//打印日历
public void show() {
//1990年1/1到这个月前一个月的天数
int days = 0;
days += dayOfYear(this.year);
days += dayOfMonth(this.month, this.year);
//在月历前的上一个月的天数
int begian = days%7;
if(this.year < 1990) {
//从1990/1/1开始到之前的某个月份, 总天数%7--begian,表示下个月留在这个月的天数
// 7 -begian 就表示这个月最后那一截,
// 用这个月的总天数 - (7-begain)再%7,得到了这个月开头的那几天, (7-开头几天)就是这个月开头的空余天数(也就是上一个月的)
int daysOfNow = dayOfMonths[this.month-1];
if(specialYear(this.month)) {
daysOfNow++;
}
daysOfNow -= (7-begian);
int n = daysOfNow%7;
begian = 7-n;
print(begian);
}else {
print(begian);
}
if(this.month > 12 || this.month < 1) {
//月份有误
System.out.println("月份有误");
return;
}
}
public void print(int begian) {
for(String s: weekDays) {
System.out.print("\t"+s);
}
System.out.println("");
//本月的天数
int daysOfNow = dayOfMonths[this.month-1];
if(specialYear(this.month)) {
daysOfNow++;
}
for(int i = 0,j = 0; i < daysOfNow ; i++,j++) {
while (begian > 0) {
//用空替代前面月的天
System.out.print("\t"+" ");
begian--;
j++;
}
System.out.print("\t"+(i+1));
if((j+1) % 7 == 0) {
System.out.println("");
}
}
}
}