鱼C论坛

 找回密码
 立即注册
查看: 2058|回复: 9

[已解决]java输入时间返回星期几

[复制链接]
发表于 2022-3-8 17:33:49 | 显示全部楼层 |阅读模式
20鱼币
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[Week];
    }


    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[i];
        }
        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个不太理解的地方 跪求大佬们帮忙解答!!
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类,更方便,不用这么麻烦的计算,可以百度看一下

最佳答案

查看完整内容

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

使用道具 举报

发表于 2022-3-8 17:33:50 | 显示全部楼层    本楼为最佳答案   
1.算总天数SumDay,month是输入的月份,如果月份是2月以后(不包含2月)。因为monthDay数组里2月份天数写死的28天,所以isLeapYear判断是不是闰年,闰年的话多个29号需要加一天
2.是因为你的月份22月,超过了monthDay数组的长度12。改的话,可以校验一下月份不能超过12并给出友好的提示。日期也需要校验一下,每个不能超过对应月的日期(你的程序没有校验)
3.是的。另外获取星期可以用Calendar类,更方便,不用这么麻烦的计算,可以百度看一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-8 19:22:42 From FishC Mobile | 显示全部楼层
这玩意还是自己写比较好,也容易排错
看别人的东西,累
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-9 11:19:02 | 显示全部楼层
本帖最后由 小伤口 于 2022-3-9 11:20 编辑

程序感觉有点点烦琐了
嗯就是你这个输入的方式是什么,我输了好几次都显示输入格式不合法
我觉得程序至少要告诉输入格式是怎样的吧,不然扼杀在摇篮里了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢大佬,我忘记设置提示了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-9 11:58:00 | 显示全部楼层
淡蓝色的花 发表于 2022-3-8 17:33
1.算总天数SumDay,month是输入的月份,如果月份是2月以后(不包含2月)。因为monthDay数组里2月份天数写死 ...

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

//若年数满足闰年的条件,则加366天,若为平年,则加355天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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循环只会循环到用户输入的年份的前一年,所以下面才会再判断一次用户的那一年
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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天,当年需要按月累加(这个地方就涉及第一个问题了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢大佬 明白了!太感谢了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-9 17:03:00 | 显示全部楼层
小伤口 发表于 2022-3-9 13:43
这个代码的for循环只会循环到用户输入的年份的前一年,所以下面才会再判断一次用户的那一年

谢谢大佬, 明白了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-4 16:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表