【问题标题】:Taking input from scanner and making a valid date从扫描仪获取输入并确定有效日期
【发布时间】:2016-07-06 17:50:16
【问题描述】:

我知道我可以使用日期格式化程序,但我正在努力学习。

我正在尝试以mm/dd/yyyy 的格式从Scanner 获取日期。当我接受本月的输入时,我遇到了麻烦。例如,如果我想要一月,我按 01,monthInt 将其转换为 1 而不是 01

我的一天也有问题。当我输入有效日期时,它一直说无效日期。我的if 声明搞砸了吗?如果您需要更多解释,请询问。感谢您的宝贵时间!

我的代码:

    System.out.println("Enter a date in the format mm/dd/yyyy");
    String mm;
    String dd;
    String yyyy;
    String January = null;
    String February = null;
    String March = null;
    String April = null;
    String May = null;
    String June = null;
    String July = null;
    String August = null;
    String September = null;
    String October = null;
    String November = null;
    String December = null;
    String month = null;
    String date = null;

    Scanner keyboard = new Scanner(System.in);

    date = keyboard.next();
    if (date.length() != 10) {
        System.out.println("Format of date is wrong");
    }
    if (date.charAt(2) != '/') {
        System.out.println("Must have / after mm");
    }
    if (date.charAt(5) != '/') {
        System.out.println("Must have / after dd");
    }

    else if (date.length() == 10 && date.charAt(2) != '/' && date.charAt(5) != '/') {
        System.out.println(date + " date is valid");
    }

    mm = date.substring(0, 1);
    int monthInt = Integer.parseInt(mm);        

    if (monthInt == 1) {
        month = January;
    } else if (monthInt == 2) {
        month = February;
    } else if (monthInt == 3) {
        month = March;
    } else if (monthInt == 4) {
        month = April;
    } else if (monthInt == 5) {
        month = May;
    } else if (monthInt == 6) {
        month = June;
    } else if (monthInt == 7) {
        month = July;
    } else if (monthInt == 8) {
        month = August;
    } else if (monthInt == 9) {
        month = September;
    } else if (monthInt == 10) {
        month = October;
    } else if (monthInt == 11) {
        month = November;
    } else if (monthInt == 12) {
        month = December;
    } else {
        System.out.println("Invalid Month");
    }

    if (monthInt < 0 || monthInt > 12) {
        System.out.println("Invalid month");
    }

    dd = date.substring(3, 4);
    int dayInt = Integer.parseInt(dd);

    if (monthInt == 1 || monthInt == 3 || monthInt == 5 || monthInt == 7 || monthInt == 8 || monthInt == 10
            || monthInt == 12 && dayInt < 0 && dayInt > 31) {
        System.out.println("Invalid day");
    }

    if (monthInt == 4 || monthInt == 6 || monthInt == 9 || monthInt == 11 
             && dayInt < 0 && dayInt > 30) {
        System.out.println("Invalid day");

    }
    if (monthInt == 2 && dayInt < 0 && dayInt > 28){
        System.out.println("Invalid day");
    }

【问题讨论】:

  • 您在哪几天和哪几个月收到错误消息?
  • 删除所有String monthName = null 的东西。这很混乱,没有必要。相反,用引号将您的month = monthName 代码括起来,使其成为真正的字符串(例如month = "January"

标签: java date parsing system.in


【解决方案1】:

您在无效日期检查中的 if 语句不正确。它应该是这样的:

if ((monthInt == 1 || monthInt == 3 || monthInt == 5 || monthInt == 7 || monthInt == 8 || monthInt == 10 || monthInt == 12) && (dayInt <= 0 || dayInt > 31)) {
    System.out.println("Invalid day");
}

if ((monthInt == 4 || monthInt == 6 || monthInt == 9 || monthInt == 11) && (dayInt <= 0 || dayInt > 30)) {
    System.out.println("Invalid day");
}

if (monthInt == 2 && (dayInt <= 0 || dayInt > 28)) {
    System.out.println("Invalid day");
}

请注意,dayInt &lt; 0 语句已更改为 dayInt &lt;=0,因为 day int 为 0 也是无效的。

这里的关键是,如果它是给定月份之一,并且超出该月的日期范围,您希望它是无效的一天。因此,您使用 if(month1 OR month2 etc) AND (outsiderange1 OR outsiderange2) 形式的复合 if。

【讨论】:

  • @DarkV1 糟糕的是,我想到了 C#。已编辑。
  • 这应该可以解决第二个问题。 +1
  • 仅供参考,这不会检查 2 月的闰日。
【解决方案2】:

看来问题出在这里:

mm = date.substring(0, 1);

它取日期字符串中的第一个字符,因此如果您输入 '01' 表示一月,它将取 '0',因此 monthInt 将为 0,您将收到“Invalid month”错误。如果要获取两个字符,则需要mm = date.substring(0, 2);

date也存在同样的问题,需要dd = date.substring(3, 5);

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多