2012-02-13 25 views
0

私はユーザーにJavaで日付を(mm/dd/yyyy)形式で入力させてから、入力した日付が有効かどうかを確認する宿題を割り当てています。うるう年を考慮に入れなければならないので、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は何も追加せず、顕著な垂直方向のスペースをとります。 –

+0

@Dave Newton私はこれを念頭に置いておきます、ありがとうございます –

+0

あなたはJavaライブラリを使用できませんか? 'java.util.Calendar'、' org.joda.time.DateTime' ?? – Gevorg

答えて

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

この行はすでに2月をキャッチ。あなたは本当の理由monthvalidDateを設定している

+0

ありがとうございました!そのような愚かな間違い: –

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

+0

@duffymoこれは今後これを行う正しい方法だと確信していますが、今のところ割り当てはユーザーの入力を分けることです;) –

+0

ああ、そうです。学習はすべての形式で行われます。 – duffymo

0

まず、それは閏年ではないので、あなたがfalseにvalidLeapYearを設定している2.

次です。

(validLeapYear == true && day <= 29)は該当しません。

(validLeapYear == false && day <= 28)もそうではありません。

したがって、validDateはまだ真です。

関連する問題