案例代码 -- 日历打印

作业⼆:
设计⼀个万年历
要求从键盘输⼊⼀个年份和⽉份,能够打印该⽉份从详细⽇历
提示: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;

	}
}

猜你喜欢

转载自www.cnblogs.com/raising/p/12913947.html
今日推荐