2012-02-13 38 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仍然如此。