输入年份和月份,获取月份日历,以1990/01/01为标准


```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("");
			}
		}
	}
	
	


}









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值