(万年历一)JAVA在控制台输出万年历(1900年起)

用Java实现在控制台输出指定年月的日历

纯算法写太麻烦?Calender对象写可香了:
(万年历二)JAVA在控制台输出万年历(Calendar版)
控制台打印太难看?已更新js控制页面的啦版:
(万年历三)利用js在html页面打印万年历

一、成品效果

  • 在控制台输出年份和月份展示如图所示:
    在这里插入图片描述
二、实现思路
  • 1.首先我们知道一个星期有7天,一年有365天(闰年366天),天数%7的余数就是星期几,所以容易想到,我们只需要设置一个已知的年月天的星期,求出相隔的日期取余即可。
    在这里插入图片描述
  • 2.如上图所示,我们可以百度查一下,2019年1月1日是星期二,2019年不是闰年,与2020年1月1日刚好差365天,365%7=1,所以往后推一天,2020年1月1日就是星期三。
  • 3.然后我们算出这个月的天数再创建一个7*7的数组,第一行放星期,后面6行放日历每天,就可以把某月的日历保存下来了。
三、代码实现,按步骤:
  • 1.静态变量初始化:
//用一个数组也可以,加个闰年判断即可,这里省事用了两个
//非闰年
static int[] daysP = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//闰年
	static int[] daysRun = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

  • 2.闰年判断:
// 判断闰年
	public static boolean isRunYear(int year) {
		boolean flag = false;

		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			flag = true;
		}

		return flag;
	}

  • 3.获取1900年1月1日(这天是星期一)到year年month月1日有多少天:
// 获取从1900年1月1日到yer年month月1日有多少天
	public static int getDaysFrom1990(int year, int month) {
		int days = 0;
		// 先算出1900年到year-1年的天数
		for (int i = 1900; i < year; i++) {
			if (isRunYear(i)) {
				days += 366;
			} else {
				days += 365;
			}
		}
		// 再加上year年1月到month-1月的天数,因为月份数组从0开始算
		if (isRunYear(year)) {
			for (int i = 0; i < month - 1; i++) {
				days += daysRun[i];
			}
		} else {
			for (int i = 0; i < month - 1; i++) {
				days += daysP[i];
			}
		}
		return days;
	}

  • 4.将日历算出并输出:
// 获取指定年月的日历 1900.1.1是星期一
	public static void getCalendar(int year, int month) {
		//日历二维数组
 		String[][] calender = new String[7][7];
		//第一行为星期
		calender[0][0] = "一    ";
		calender[0][1] = "二    ";
		calender[0][2] = "三    ";
		calender[0][3] = "四    ";
		calender[0][4] = "五    ";
		calender[0][5] = "六    ";
		calender[0][6] = "日";
		//获取天数
		int days = getDaysFrom1990(year, month);
		//获取星期几,0是星期天
		int weekDay= days % 7;
		//根据今年是否为闰年来将天数放进二维数组
		if(isRunYear(year)) {
			days = daysRun[month-1];
		}else {
			days = daysP[month-1];
		}
		//存入日历二维数组
		int j;
		if (weekDay == 0) {
			j = 6;
		}else {
			j = weekDay;
		}
		int count = 1;
		for (int i = 1; i < calender.length; i++) {
			if(i!=1) {//第一次外层循环,j按照星期天数定
				j = 0;
			}
			for (; j < calender[0].length; j++) {
				calender[i][j] =count+""; 
				count++;
				if (count >= days+1) {
					break;
				}
			}
			if (count >= days+1) {
				break;
			}
		}
		
		//输出万年历
		//输出第一行
		for (int i = 0; i < calender[0].length; i++) {
			System.out.print(calender[0][i]+" ");
		}
		//输出其余行
		System.out.println();
		for (int i = 1; i < calender.length; i++) {
			for (int k = 0; k < calender[0].length; k++) {
				if(calender[i][k]==null) {
					System.out.print("   ");
				}else {
					//向左对齐,两字符宽度输出
					System.out.printf("%-2d ",(int)Integer.parseInt(calender[i][k]));
				}
			}
			System.out.println();
		}
	}
四、完整代码:

import java.time.Year;
import java.util.Arrays;
import java.util.Scanner;

//万年历
public class Test10 {
	static int[] daysP = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	static int[] daysRun = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("===========欢迎来到万年历系统===========");
		System.out.println("请输入您需要查询的日历年份:");
		int year = sc.nextInt();
		if (year < 1900) {
			System.out.println("请输入1900年以后的年份");
			System.out.println("程序终止........");
			return;
		}
		System.out.println("请输入您需要查询的日历月份:");
		int month = sc.nextInt();
		if (month < 1 || month > 12) {
			System.out.println("请输入1-12中的月份");
			System.out.println("程序终止........");
			return;
		}

		System.out.printf("==========%d年%d月的日历为:==========\n",year,month);
		getCalendar(year, month);
	}

	// 判断闰年
	public static boolean isRunYear(int year) {
		boolean flag = false;

		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			flag = true;
		}

		return flag;
	}

	// 获取从1900年1月1日到yer年month月1日有多少天
	public static int getDaysFrom1990(int year, int month) {
		int days = 0;
		// 先算出1900年到year-1年的天数
		for (int i = 1900; i < year; i++) {
			if (isRunYear(i)) {
				days += 366;
			} else {
				days += 365;
			}
		}
		// 再加上year年1月到month-1月的天数
		if (isRunYear(year)) {
			for (int i = 0; i < month - 1; i++) {
				days += daysRun[i];
			}
		} else {
			for (int i = 0; i < month - 1; i++) {
				days += daysP[i];
			}
		}
		return days;
	}

	// 获取指定年月的日历 1900.1.1是星期一
	public static void getCalendar(int year, int month) {
		//日历二维数组
 		String[][] calender = new String[7][7];
		//第一行为星期
		calender[0][0] = "一    ";
		calender[0][1] = "二    ";
		calender[0][2] = "三    ";
		calender[0][3] = "四    ";
		calender[0][4] = "五    ";
		calender[0][5] = "六    ";
		calender[0][6] = "日";
		//获取天数
		int days = getDaysFrom1990(year, month);
		//获取星期几,0是星期天
		int weekDay= days % 7;
		//根据今年是否为闰年来将天数放进二维数组
		if(isRunYear(year)) {
			days = daysRun[month-1];
		}else {
			days = daysP[month-1];
		}
		//存入日历二维数组
		int j;
		if (weekDay == 0) {
			j = 6;
		}else {
			j = weekDay;
		}
		int count = 1;
		for (int i = 1; i < calender.length; i++) {
			if(i!=1) {//第一次外层循环,j按照星期天数定
				j = 0;
			}
			for (; j < calender[0].length; j++) {
				calender[i][j] =count+""; 
				count++;
				if (count >= days+1) {
					break;
				}
			}
			if (count >= days+1) {
				break;
			}
		}
		
		//输出万年历
		//输出第一行
		for (int i = 0; i < calender[0].length; i++) {
			System.out.print(calender[0][i]+" ");
		}
		//输出其余行
		System.out.println();
		for (int i = 1; i < calender.length; i++) {
			for (int k = 0; k < calender[0].length; k++) {
				if(calender[i][k]==null) {
					System.out.print("   ");
				}else {
					//向左对齐,两字符宽度输出
					System.out.printf("%-2d ",(int)Integer.parseInt(calender[i][k]));
				}
			}
			System.out.println();
		}
	}
}

看完后可以使用Calendar类更简单的输出万年历
JAVA在控制台输出万年历二(Calendar版)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值