午后狂睡 发表于 2022-3-8 17:33:49

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为星期四,因此排序需要这么排?

淡蓝色的花 发表于 2022-3-8 17:33:50

1.算总天数SumDay,month是输入的月份,如果月份是2月以后(不包含2月)。因为monthDay数组里2月份天数写死的28天,所以isLeapYear判断是不是闰年,闰年的话多个29号需要加一天
2.是因为你的月份22月,超过了monthDay数组的长度12。改的话,可以校验一下月份不能超过12并给出友好的提示。日期也需要校验一下,每个不能超过对应月的日期(你的程序没有校验)
3.是的。另外获取星期可以用Calendar类,更方便,不用这么麻烦的计算,可以百度看一下

wp231957 发表于 2022-3-8 19:22:42

这玩意还是自己写比较好,也容易排错
看别人的东西,累

小伤口 发表于 2022-3-9 11:19:02

本帖最后由 小伤口 于 2022-3-9 11:20 编辑

程序感觉有点点烦琐了
嗯就是你这个输入的方式是什么,我输了好几次都显示输入格式不合法{:10_250:}
我觉得程序至少要告诉输入格式是怎样的吧,不然扼杀在摇篮里了{:10_266:}

午后狂睡 发表于 2022-3-9 11:51:40

小伤口 发表于 2022-3-9 11:19
程序感觉有点点烦琐了
嗯就是你这个输入的方式是什么,我输了好几次都显示输入格式不合法
我觉 ...

谢谢大佬,我忘记设置提示了

午后狂睡 发表于 2022-3-9 11:58:00

淡蓝色的花 发表于 2022-3-8 17:33
1.算总天数SumDay,month是输入的月份,如果月份是2月以后(不包含2月)。因为monthDay数组里2月份天数写死 ...

大佬您好还有最后一个小疑问, 您第一点那里说闰年二月份加 29天,但是我前面有设置闰年的话 直接加366天,这两个条件是否有冲突之类的,就剩这里有的小疑问

//若年数满足闰年的条件,则加366天,若为平年,则加355天

小伤口 发表于 2022-3-9 13:43:13

午后狂睡 发表于 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 16:50:14

午后狂睡 发表于 2022-3-9 11:58
大佬您好还有最后一个小疑问, 您第一点那里说闰年二月份加 29天,但是我前面有设置闰年的话 直接加366天 ...

for (int i = 1970; i < year; i++) {
你这个for循环里,比如输入20000301,循环到1999年就结束了,2000年的天数需要按月累加。
所以你这个想法是对的,当年之前的每年366天或者365天,当年需要按月累加(这个地方就涉及第一个问题了)

午后狂睡 发表于 2022-3-9 17:02:00

淡蓝色的花 发表于 2022-3-9 16:50
for (int i = 1970; i < year; i++) {
你这个for循环里,比如输入20000301,循环到1999年就结束了,2000 ...

谢谢大佬 明白了!太感谢了!

午后狂睡 发表于 2022-3-9 17:03:00

小伤口 发表于 2022-3-9 13:43
这个代码的for循环只会循环到用户输入的年份的前一年,所以下面才会再判断一次用户的那一年

谢谢大佬, 明白了~
页: [1]
查看完整版本: java输入时间返回星期几