java输入时间返回星期几
package Test;import java.util.Objects;
import java.util.Scanner;
/**
* 程序1:
* 输入年月日,返回星期几
* <p>
* 输入格式:
* 20190815(范围是19700101~99991231)
* <p>
* 输出格式:
* 星期四(范围是星期一、星期二、……星期六、星期日)
* <p>
* 要求:
* 1、符合代码规范
* 2、输入是否合法检查,不准使用正则表达式
* 3、考虑更好的用户交互,有一定容错,比如用户输入“20190815 ”是认为正确的输入
* 4、输入错误时,允许用户重新输入
* 5、要有完善的错误提示
* 6、代码封装要合理
*/
public class Test {
public static void main(String[] args) throws Exception {
try {
int year, month, day;
//day0 用于获取对应的用户输入的信息
String day0;
Scanner sc = new Scanner(System.in);
System.out.println("欢迎使用日期查询系统~");
System.out.println("若您需要退出当前系统请输入'exit'即可~");
while (true) {
System.out.println("------------------");
System.out.println("请您输入要查询的年月日:");
day0 = sc.nextLine();
if (day0.equals("exit")) {
break;
} else if (WrongWarning(day0)) {
//对年月日进行分割,便于后续的各种判断和操作
year = Integer.parseInt(day0.substring(0, 4));
month = Integer.parseInt(day0.substring(4, 6));
day = Integer.parseInt(day0.substring(6, 8));
legalYear(year);
legalMonth(month);
legalDay(day);
int week = getWeekOfDay(year, month, day);
if (judgeYear(year) == true) {
System.out.printf("您所查询的年份为:%d 为闰年", year);
} else {
System.out.printf("您所查询的年份为:%d 为平年", year);
}
System.out.println();
System.out.println("您所查询的月份为:" + month);
System.out.println("您所查询的日期为:" + day);
System.out.println("您所查询的日期为:" + Weekend(week));
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("您的输入有误.");
}
}
public static boolean legalYear(int year) {
if (year < 1970 || year > 9999) {
System.out.println("您的年份输入错误!请您重新输入");
return false;
}
return true;
}
public static boolean legalMonth(int month) {
if (month < 1 || month > 12) {
System.out.println("您的月份输入错误!请您重新输入");
return false;
}
return true;
}
public static boolean legalDay(int day) {
if (day <= 0 || day > 31) {
System.out.println("您的日期输入错误!请您重新输入");
return true;
}
return false;
}
public static String Weekend(int Week) {
String[] weekName = {"星期三", "星期四", "星期五", "星期六", "星期日", "星期一", "星期二"};
return weekName;
}
static boolean judgeYear(int year) {
if (year % 400 == 0)
return true;
else if ((year % 4 == 0) && (year % 100 != 0))
return true;
else
return false;
}
/**
* 获得总天数并对七求余获得对应的星期几
* @param year用于判断输入的年份的天数
* @param month 用于判断输入的月份的天数
* @param day 用于判读输入的剩余天数
* @return 返还一个对 7求余的后数
*/
static int getWeekOfDay(int year, int month, int day) throws Exception{
int week = -1;
boolean isLeapYear = false;
//SumDay用于计算从1970到用户输入的总天数
int SumDay = 0;
//monthDay数组用于存储一年中每个月的天数
int[] monthDay = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (year >= 1970) {
for (int i = 1970; i < year; i++) {
//若年数满足闰年的条件,则加366天,若为平年,则加355天
if (judgeYear(i)) {
SumDay += 366;
} else SumDay += 365;
}
}
for (int i = 0; i < month - 1; i++) {
SumDay += monthDay;
}
if (month > 2) {
isLeapYear = judgeYear(year);
if (isLeapYear)
SumDay++;
}
//SumDay再加上剩余的天数即可得到总天数
SumDay += day;
week = SumDay % 7;
//返回求余后的值,返回到Week数组中获取对应的星期几
return week;
}
public static boolean WrongWarning(String string) {
if (Objects.isNull(string)) {
System.out.println("错误:输入的字符串不能为空!");
return false;
}
if (string.length() != 8) {
System.out.println("错误:输入的字符串不符合格式!");
return false;
}
if (string.equals("")) {
System.out.println("错误:输入的字符串为空串!");
return false;
}
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (c < '0' || c > '9') {
System.out.println("错误:输入参数不和法!");
return false;
}
}
return true;
}
}
有3个不太理解的地方 跪求大佬们帮忙解答!!{:5_100:}
1. 代码中标红的地方month> 2 的时候为什么需要再加一,闰年的条件 上面不应该year 那里已经自增过了呀.
2. 运行代码的时候 , 当我输入 11112233 的时候, 程序出现越界异常, 直接中断了 我想了很久,还是不清楚应该如何修改 , 求大佬指点一下.
这是控制台返回的信息:
java.lang.ArrayIndexOutOfBoundsException: Index 12 out of bounds for length 12
at Test.Test.getWeekOfDay(Test.java:127)
at Test.Test.main(Test.java:47)
3. 代码中标记为蓝色的地方,是否是因为1970-01-01为星期四,因此排序需要这么排? 1.算总天数SumDay,month是输入的月份,如果月份是2月以后(不包含2月)。因为monthDay数组里2月份天数写死的28天,所以isLeapYear判断是不是闰年,闰年的话多个29号需要加一天
2.是因为你的月份22月,超过了monthDay数组的长度12。改的话,可以校验一下月份不能超过12并给出友好的提示。日期也需要校验一下,每个不能超过对应月的日期(你的程序没有校验)
3.是的。另外获取星期可以用Calendar类,更方便,不用这么麻烦的计算,可以百度看一下 这玩意还是自己写比较好,也容易排错
看别人的东西,累
本帖最后由 小伤口 于 2022-3-9 11:20 编辑
程序感觉有点点烦琐了
嗯就是你这个输入的方式是什么,我输了好几次都显示输入格式不合法{:10_250:}
我觉得程序至少要告诉输入格式是怎样的吧,不然扼杀在摇篮里了{:10_266:} 小伤口 发表于 2022-3-9 11:19
程序感觉有点点烦琐了
嗯就是你这个输入的方式是什么,我输了好几次都显示输入格式不合法
我觉 ...
谢谢大佬,我忘记设置提示了 淡蓝色的花 发表于 2022-3-8 17:33
1.算总天数SumDay,month是输入的月份,如果月份是2月以后(不包含2月)。因为monthDay数组里2月份天数写死 ...
大佬您好还有最后一个小疑问, 您第一点那里说闰年二月份加 29天,但是我前面有设置闰年的话 直接加366天,这两个条件是否有冲突之类的,就剩这里有的小疑问
//若年数满足闰年的条件,则加366天,若为平年,则加355天 午后狂睡 发表于 2022-3-9 11:58
大佬您好还有最后一个小疑问, 您第一点那里说闰年二月份加 29天,但是我前面有设置闰年的话 直接加366天 ...
for (int i = 1970; i < year; i++) {
//若年数满足闰年的条件,则加366天,若为平年,则加355天
if (judgeYear(i)) {
SumDay += 366;
} else SumDay += 365;
}
这个代码的for循环只会循环到用户输入的年份的前一年,所以下面才会再判断一次用户的那一年 午后狂睡 发表于 2022-3-9 11:58
大佬您好还有最后一个小疑问, 您第一点那里说闰年二月份加 29天,但是我前面有设置闰年的话 直接加366天 ...
for (int i = 1970; i < year; i++) {
你这个for循环里,比如输入20000301,循环到1999年就结束了,2000年的天数需要按月累加。
所以你这个想法是对的,当年之前的每年366天或者365天,当年需要按月累加(这个地方就涉及第一个问题了) 淡蓝色的花 发表于 2022-3-9 16:50
for (int i = 1970; i < year; i++) {
你这个for循环里,比如输入20000301,循环到1999年就结束了,2000 ...
谢谢大佬 明白了!太感谢了! 小伤口 发表于 2022-3-9 13:43
这个代码的for循环只会循环到用户输入的年份的前一年,所以下面才会再判断一次用户的那一年
谢谢大佬, 明白了~
页:
[1]