新的一年学会时间管理:一个能计算具体日期是星期几的“人工智能”(Java实现+只调用Scanner类+编译器控制台输出展示)

1、动机

  2022年的第一篇博客,感谢c站,见证了我上一年的成长!
  言归正传,我们在推算日期之前首先要有一个基准,这个基准你可以随便选择。我选择了2019年的元旦(这个可以自己定义,如果变动可能需要适当修改代码)。

比方说:在这里插入图片描述

  接着通过算法整体的框架,可以向前或向后推算出我们输入的目标年月日对应的具体日期。
  整体代码框架首先判断是否是平年,还是闰年。我在主函数外定义了两个数组,分别对应每一个月份的天数。然后在这个两个模块内,又分别定义三个模块:利用if、else if 和else区分,分别代表输入2019年的(例如2019年7月1日),2019年以后(例如2025年5月1日)及2019年之前(例如2000年6月1日)的年份。由于我们知道2019年元旦是星期几,又接着我们获得了月份差,进而获得天数差(相对于2019年元旦)。那么在这时就可以以一周为单位,对天数求余数(mod 7),进行推算。最终我们输出结果。(下文代码中,我写有注释,易懂)

  实验准备:定义一个DateCalculatorAI类直接在java的主流编译器(eclipse等)跑代码就行。

2、实现结果

1
2

3、Java代码实现

import java.util.Scanner;

public class DateCalculatorAI {

	public DateCalculatorAI() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 地球绕太阳公转一周叫做一回归年,一回归年长365日5时48分46秒。因此,公历规定有平年和闰年,平年一年有365日,
		// 比回归年短0.2422日,四年共短0.9688 日,故每四年增加一日,这一年有366日,就是闰年。但四年增加一日比四个回归年又多0.0312日,
		// 400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年,这样公历年的平均长度与回归年就相近似了。
		System.out.print("已知2019年是一个平年,它有365天。");
		System.out.println("2019年的元旦是星期二。");
		System.out.println("欢迎进入计算日期的人工智能!");
		System.out.println("——————————————————————Begin——————————————————————");	

		int[] noleapYear = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		int[] leapYear = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		int times = 0;
		String next = "Y";
		Scanner scan = new Scanner(System.in);
		do {
			int x = 0;
			int y = 0;
			int z = 0;
			int a = 0;
			int b = 0;
			int c = 0;
			int k = 0;
			int day = 0;
			
			times++;
			System.out.println("------------------------"+times+"------------------------");

			System.out.println("请你输入年份:");
			x = scan.nextInt();
			if (((x % 100 == 0) && (x % 400 != 0)) || ((x % 100 != 0) && (x % 4 != 0))) {
				System.out.println("您要查询的" + x + "年是一个平年");
				System.out.println("请你输入月份");
				y = scan.nextInt();
				System.out.println("您想要查找的是" + x + "年" + y + "月");
				System.out.println("请输入你想查找的具体日期:");
				scan = new Scanner(System.in);
				z = scan.nextInt();
				a = x - 2019;// a是年份之差
				if (a == 0) {
					c = y - 1;// c是月份之差
					b = z - 1;// b是日期之差
					if (c > 0) {
						day = noleapYear[0];
						for (int i = 1; i <= c - 1; i++) {
							day += noleapYear[i];
						}
						k = (day + b) % 7;
					} else
						k = b % 7;
					System.out.print(">>输出:");
					switch (k) {
					
					case (0):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期二。");
						break;
					case (1):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期三。");
						break;
					case (2):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期四。");
						break;
					case (3):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期五。");
						break;
					case (4):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期六。");
						break;
					case (5):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期日。");
						break;
					case (6):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期一。");
						break;
					}
					System.out.println("请问您是否还想查询一次日期?");
					System.out.println("是的话请输入Y/y,否则按任意键退出程序,谢谢。");
					scan = new Scanner(System.in);
					next = scan.nextLine();
				} else if (a > 0) {
					day = 365 * a;

					for (int j = 2019; j < x; j++) {
						while (!(((j % 100 == 0) && (j % 400 != 0)) || ((j % 100 != 0) && (j % 4 != 0)))) {
							day += 1;
							break;// 没有加break的话会使循环崩溃
						}
					}
					c = y - 1;// c是月份之差
					b = z - 1;// b是日期之差

					if (c > 0) {
						for (int i = 0; i < c; i++) {
							day += noleapYear[i];
						}
						k = (day + b) % 7;
					} else
						k = (day + b) % 7;
					System.out.print(">>输出:");
					switch (k) {
					case (0):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期二。");
						break;
					case (1):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期三。");
						break;
					case (2):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期四。");
						break;
					case (3):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期五。");
						break;
					case (4):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期六。");
						break;
					case (5):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期日。");
						break;
					case (6):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期一。");
						break;
					}
					System.out.println("请问您是否还想查询一次日期?");
					System.out.println("是的话请输入Y/y,否则按任意键退出程序,谢谢。");
					scan = new Scanner(System.in);
					next = scan.nextLine();
				} else {
					a = Math.abs(a) - 1;
					day = 365 * a;
					for (int j = x; j < 2019; j++) {
						while (!(((j % 100 == 0) && (j % 400 != 0)) || ((j % 100 != 0) && (j % 4 != 0)))) {
							day += 1;
							break;
						}
					}
					c = y - 1;// c是月份之差
					b = noleapYear[y - 1] - z + 1;// b是日期之差

					for (int i = 11; y - 1 < i; i--) {// 不知道会不会有误差在此处
						day += noleapYear[i];
					}
					k = (day + b) % 7;
					System.out.print(">>输出:");
					switch (k) {
					case (0):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期二。");
						break;
					case (1):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期一。");
						break;
					case (2):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期日。");
						break;
					case (3):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期六。");
						break;
					case (4):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期五。");
						break;
					case (5):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期四。");
						break;
					case (6):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期三。");
						break;
					}
					System.out.println("请问您是否还想查询一次日期?");
					System.out.println("是的话请输入Y/y,否则按任意键退出程序,谢谢。");
				    scan = new Scanner(System.in);
					next = scan.nextLine();
				}
			} else {
				System.out.println("您要查询的" + x + "年是一个闰年");
				System.out.println("请你输入月份:");
				scan = new Scanner(System.in);
				y = scan.nextInt();
				System.out.println("您想要查找的是" + x + "年" + y + "月");
				System.out.println("请输入你想查找的具体日期:");
				z = scan.nextInt();
				a = x - 2019;// a是年份之差
				if (a == 0) {
					c = y - 1;// c是月份之差
					b = z - 1;// b是日期之差
					if (c > 0) {
						for (int i = 0; i < y - 1; i++) {
							day += leapYear[i];
						}
						k = (day + b) % 7;
					} else
						k = b % 7;
					System.out.print(">>输出:");
					switch (k) {
					case (0):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期二。");
						break;
					case (1):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期三。");
						break;
					case (2):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期四。");
						break;
					case (3):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期五。");
						break;
					case (4):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期六。");
						break;
					case (5):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期日。");
						break;
					case (6):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期一。");
						break;
					}
					System.out.println("请问您是否还想查询一次日期?");
					System.out.println("是的话请输入Y/y,否则按任意键退出程序,谢谢。");
					scan = new Scanner(System.in);
					next = scan.nextLine();
				} else if (a > 0) {
					day = 365 * a;
					for (int j = 2019; j < x; j++) {
						while (!(((j % 100 == 0) && (j % 400 != 0)) || ((j % 100 != 0) && (j % 4 != 0)))) {
							day += 1;
							break;
						}
					}
					c = y - 1;// c是月份之差
					b = z - 1;// b是日期之差
					if (c > 0) {
						for (int i = 0; i < y - 1; i++) {
							day += leapYear[i];
						}
						k = (day + b) % 7;
					} else
						k = (day + b) % 7;
					System.out.print(">>输出:");
					switch (k) {
					case (0):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期二。");
						break;
					case (1):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期三。");
						break;
					case (2):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期四。");
						break;
					case (3):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期五。");
						break;
					case (4):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期六。");
						break;
					case (5):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期日。");
						break;
					case (6):
						System.out.println(x + "年" + y + "月" + z + "日" + "是星期一。");
						break;
					}
					System.out.println("请问您是否还想查询一次日期?");
					System.out.println("是的话请输入Y/y,否则按任意键退出程序,谢谢。");
					scan = new Scanner(System.in);
					next = scan.nextLine();
				} else {
					a = Math.abs(a) - 1;
					day = 365 * a;
					if (a == 0) {
						b = leapYear[y - 1] - z + 1;// b是日期之差
						for (int i = 11; y - 1 < i; i--) {
							day += leapYear[i];
						}
						k = (day + b) % 7;
						System.out.print(">>输出:");
						switch (k) {
						case (0):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期二。");
							break;
						case (1):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期一。");
							break;
						case (2):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期日。");
							break;
						case (3):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期六。");
							break;
						case (4):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期五。");
							break;
						case (5):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期四。");
							break;
						case (6):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期三。");
							break;
						}
						System.out.println("请问您是否还想查询一次日期?");
						System.out.println("是的话请输入Y/y,否则按任意键退出程序,谢谢。");
						scan = new Scanner(System.in);
						next = scan.nextLine();
					} else {
						for (int j = 2019; x < j; j--) {
							while (!(((j % 100 == 0) && (j % 400 != 0)) || ((j % 100 != 0) && (j % 4 != 0)))) {
								day += 1;
								break;
							}
						}
						b = leapYear[y - 1] - z + 1;// b是日期之差
						for (int i = 11; y - 1 < i; i--) {
							day += leapYear[i];
						}
						k = (day + b) % 7;
						System.out.print(">>输出:");
						switch (k) {
						case (0):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期二。");
							break;
						case (1):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期一。");
							break;
						case (2):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期日。");
							break;
						case (3):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期六。");
							break;
						case (4):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期五。");
							break;
						case (5):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期四。");
							break;
						case (6):
							System.out.println(x + "年" + y + "月" + z + "日" + "是星期三。");
							break;
						}
						System.out.println("请问您是否还想查询一次日期?");
						System.out.println("是的话请输入Y/y,否则按任意键退出程序,谢谢。");
						scan = new Scanner(System.in);
						next = scan.nextLine();
					}	
				}
			}
			
		} while (next.equalsIgnoreCase("Y"));
		System.out.println("——————————————————————End——————————————————————");
		System.out.println("您已经退出查询日期系统,欢迎下次使用!");
		scan.close();
	}
}

4、结语

  这份代码是在19年6月份和她在的图书馆第一次完成,我记得从晚上七点一直写到了图书馆闭馆。而如今我已大四,过去的往事如风远去,但点点滴滴犹记我心。(下图摄于2021年12月28日)
湛江机场

  这篇博文我趁着毕设开题前整理出来,代码已检查,如仍有错误还请指正。
  原创不易,觉得不错的话,请给博主一键三连吧,你的支持是我创作的最大动力!如需转载,请联系博主
  祝愿你我在新的一年都学有所成,一切顺利

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TerryBlog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值