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