从用户输入验证日期

时间:2016-02-26 03:35:27

标签: java validation date switch-statement

我正在编写一个程序,我应该让用户输入0 - 4000年的日期。我应该看看日期是否有效,以及是否是闰年。我的代码有问题。 我在第57行得到了一个没有错误的别人。 我也不知道怎么说如果日期有效。 IE:这个日期有效,是闰年 - 或者无效是闰年......等等......

我还是初学者,所以我不想要为我编写的代码,但我想知道如何修复它!谢谢。

import java.util.*;

public class LegalDate   //file name
{
        public static void main (String [] args)

    {
        Scanner kb = new Scanner (System.in); //new scanner
        //name the variables
        int month, day, year;
        int daysinMonth;
        boolean month1, year1, day1;
        boolean validDate;
        boolean leapYear;



        //ask the user for input
        //I asked the MM/DD/YYYY in seperate lines to help me visually with the program
        System.out.println("Please enter the month, day, and year  in interger form: " );
        kb.nextInt();

        //now I'm checking to see if the month and years are valid
        if (month <1 || month >12)
            { month1 = true;}
        if (year <0 || year >4000)
            {year1= true;}

        //I'm using a switch here instead of an if-else statement, which can also be used


             switch (month) {
                case 1:
                case 3:
                case 5:             //months with 31 days
                case 7:
                case 8:
                case 10:
                case 12:
                     numDays = 31;
                     break;
                 case 4:
                 case 6:              //months with 30 days
                 case 9:
                 case 11:
                     numDays = 30;
                     break;

                 case 2:
                     if (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0))  //formula for leapyear
                         numDays = 29;
                            {
                                system.out.println("is a leap year");
                                }
                     else
                         numDays = 28;
                            {
                                system.out.println("is not a leap year");
                                }
                     break;
                default:
                     System.out.println("Invalid month.");
                break;

                     if (month1 == true)
                     if (day1 == true)
                     if (year1 == true)
                           System.out.println ("date is valid ");

                     else
                     if (month1 == false)
                           System.out.println ("date is invalid");

                     else
                     if (day1 == false)
                           System.out.println ("date is invalid");

                      else
                      if (year1 == false)
                           System.out.println ("date is invalid");



    }}

}

4 个答案:

答案 0 :(得分:0)

在第57行,您打开一个新的代码块,但没有任何东西可以访问它。我相信你打算输入:

else{
        numDays = 28;
        system.out.println("is not a leap year");
    }

作为一个小技巧,你可以改变这个:

if (month1 == true)
                 if (day1 == true)
                 if (year1 == true)
                       System.out.println ("date is valid ");

到此:

if (month1 && day1 && year1)
   System.out.println ("date is valid ");

由于布尔比较运算符返回true或false,因此可以告诉条件只需要布尔值。由于month1day1year1都是布尔值,因此您无需将它们与任何内容进行比较。

如果您不知道,条件意味着month1day1以及year1是否都为真,那么打印date is valid

答案 1 :(得分:0)

为什么不尝试 Java 8日期时间 API

验证日期并为您做更多事情

try {
        LocalDate date =LocalDate.of(2016, 12, 31);
        if(date.isLeapYear())
            System.out.println("Leap year");
        else 
            System.out.println("Not leap year"); 
}
catch(DateTimeException e) {
   System.out.println(e.getMessage());
}

答案 2 :(得分:0)

程序第50行的if-else语句的语法不正确。 这是一个悬而未决的事。将大括号中的if和else语句包含在大括号中应解决此问题。

if (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0))  
{ 
    numDays = 29;                            
    system.out.println("is a leap year");
}
else
{
    numDays = 28;
    system.out.println("is not a leap year");
}

您可以使用IDE或注意编译器错误消息来解决此类错误。

答案 3 :(得分:0)

您似乎没有将代码放在大括号中的'if'和'else'语句之间,这意味着该语句仅适用于下一行。例如:

if (a)
    b = true
    c = true
else
    d = true

读作

if (a) {
    b = true
}
c = true
else {
    d = true
}

希望您可以看到编译器不会理解这一点,因为'else'语句必须在其关联的'if'块之后直接发生。

我建议添加一些方法来简化代码。例如:

public static boolean isLeapYear(int year) {
    return (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0));
}

此外,如果您使用布尔变量来存储信息,您可以在最后整齐地打印它。例如,您可以在代码顶部将变量'isValid'实例化为true,如果计算日期无效,则将其设置为false,并在末尾使用if语句打印结果。

我知道你说过你不想为你写的,但这是证明方法重要性的最简单方法。希望您能看到它比您的版本更具可读性吗?

import java.util.Scanner;

public class LegalDate {

    static final int maxYear = 4000;

    public static void main (String [] args) {
        int month, day, year;
        boolean leapYear, validDate = false;

        Scanner kb = new Scanner (System.in);
        System.out.println("Please enter the month, day, and year in interger form.");

        System.out.print("Month: ");
        month = kb.nextInt();
        System.out.print("Day: ");
        day = kb.nextInt();
        System.out.print("Year: ");
        year = kb.nextInt();

        leapYear = isLeapYear(year);
        validDate = isValidDate(month, day, year);

        System.out.printf("%nThe date is %svalid and is %sa leap year.%n", validDate ? "" : "not ", leapYear ? "" : "not ");
        kb.close();
    }

    public static int numDaysInMonth(int month, boolean isLeapYear) {
        switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
             return 31;
        case 4:
        case 6:
        case 9:
        case 11:
             return 30;
        case 2:
             if (isLeapYear) {
                 return 29;
             } else {
                 return 28;
             }
        default:
             return 0;
        }
    }

    public static boolean isLeapYear(int year) {
        return (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0));
    }

    public static boolean isValidDate(int month, int day, int year) {
        return (month >= 1 && month <= 12) && (day >= 1 && day <= numDaysInMonth(month, isLeapYear(year))) && (year >= 0 && year <= maxYear);
    }
}

如果您有任何疑问,我会尽力回答!