2012-02-13 46 views
0

我有一个家庭作业,要求用户用(mm/dd/yyyy)格式输入Java中的日期,然后确定输入的日期是否有效。除了2月份以外,我每个月都能成功完成这项工作,因为您必须考虑闰年。确定Java中的有效日期

我有这样的代码:

import java.util.Scanner; 

/** 
* 
* @author Andrew De Forest 
* @version v1.0 
* 
*/ 
public class exc6 
{ 
    public static void main (String[] args) 
    { 
     //Initialize a string 
     String getInput; 
     //Initialize some integers 
     int month, day, year; 
     //Make a boolean 
     boolean validDate; 
     //Set the date to false 
     validDate = false; 
     //Ask for input 
     System.out.println("Enter a date (mm/dd/yyyy)"); 
     //Initialize the scanner 
     Scanner keyboard = new Scanner (System.in); 
     //Get input & use a delimiter 
     keyboard.useDelimiter("[/\n]"); 
     month = keyboard.nextInt(); 
     day = keyboard.nextInt(); 
     year = keyboard.nextInt(); 

     if((month >= 1 && month <= 12) && (day >= 1 && day <= 31)) 
     { 
      //For months with 30 days 
      if((month == 4 || month == 6 || month == 9 || month == 11) && (day <= 30)) 
      { 
       validDate = true; 
      } 

      //For months with 31 days 
      if((month == 1 || month == 2 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && (day <= 31)) 
      { 
       validDate = true; 
      } 

      //For February 
      if((month == 2) && (day < 30)) 
      { 
       //Boolean for valid leap year 
       boolean validLeapYear = false; 

       //A leap year is any year that is divisible by 4 but not divisible by 100 unless it is also divisible by 400 
       if((year % 400 == 0) || ((year % 4 == 0) && (year %100 !=0))) 
       { 
        validLeapYear = true; 
       } 

       if (validLeapYear == true && day <= 29) 
       { 
        validDate = true; 
       } 

       else if (validLeapYear == false && day <= 28) 
       { 
        validDate = true; 
       } 
      } 
     } 

     //If the date is valid 
     if(validDate == true) 
     { 
      System.out.println(month + "/" + day + "/" + year + " is a valid date."); 
     } 

     else 
     { 
      System.out.println("Invalid date!"); 
     } 

    } 
} 

我最关心的部分是这样的:

//For February 
    if((month == 2) && (day < 30)) 
    { 
     //Boolean for valid leap year 
     boolean validLeapYear = false; 

     //A leap year is any year that is divisible by 4 but not divisible by 100 unless it is also divisible by 400 
     if((year % 400 == 0) || ((year % 4 == 0) && (year %100 !=0))) 
     { 
      validLeapYear = true; 
     } 

     if (validLeapYear == true && day <= 29) 
     { 
      validDate = true; 
     } 

     else if (validLeapYear == false && day <= 28) 
     { 
      validDate = true; 
     } 
    } 
} 

据我所知,它看起来是正确的。然而,当我输入类似2/29/2011的东西时,它会作为有效日期返回(不应该这样,因为2011年不是闰年)。为什么是这样?我错过了什么,或者过去了,导致错误的日期返回有效?

+2

尝试使注释有意义,而不仅仅是代码的重复。此外,在发布代码时,尝试删除不相关的内容,例如,开放的javadoc不会增加任何值,并占用明显的垂直空间。 – 2012-02-13 00:56:33

+0

@Dave Newton我会记住这一点,谢谢 – 2012-02-13 01:06:49

+0

你不能使用任何java库吗? 'java.util.Calendar','org.joda.time.DateTime'? – Gevorg 2012-02-13 02:23:06

回答

4
if((month == 1 || month == 2 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && (day <= 31)) 

这条线已经赶上二月。

+0

非常感谢!这样一个愚蠢的错误:) – 2012-02-13 01:04:51

2
DateFormat dateFormat = new SimpleDateFormat("yyyy-MMM-dd"); 
dateFormat.setLenient(false); 
String dateAsString = "2011-Feb-29"; 
Date date = dateFormat.parse(dateAsString); // throws an exception; invalid date 
+2

虽然确实是正确的方式,我不确定导师是否允许使用'DateFormat'来完成这项家庭作业。 – BalusC 2012-02-13 01:03:25

+0

@duffymo我相信这将是未来做到这一点的正确方法,但现在的任务是挑选用户的输入;) – 2012-02-13 01:05:56

+0

噢,好吧。学习有各种形式。 – duffymo 2012-02-13 01:09:25

0

首先你设置validDate为true,因为month是2

接下来你设置validLeapYear为false,因为它不是一个闰年。

(validLeapYear == true && day <= 29)不正确。

(validLeapYear == false && day <= 28)也是不正确的。

因此,validDate仍然如此。