2013-03-27 126 views
-1

我有兩個類,Main1和一個日期(我自己定義的日期類)。我正在嘗試獲取用戶輸入的日,月和年,然後嘗試檢查這是否是使用我的日期類的有效日期。我真的很困惑,不確定這是否正確。JAVA-無法檢查用戶輸入日期是否正確

繼承人爲MAIN1類的代碼:

public class Main1 { 
public static void main(String[] args){  
    int myDay = 0, myMonth = 0, myYear = 0; 
    boolean dataCorrect = false; 
    date travelDate; // travelDate will hold the date entered 
    do { 
     try { 
      do { 
       myDay = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter the day: ")); 
       myMonth = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter the month: ")); 
       myYear = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter the year: "));     
       travelDate = new date(myDay,myMonth,myYear);      
      } while (travelDate.checkInputs(travelDate.formDate()) == false); // keeps looping until the date entered is correct      
      dataCorrect = true;     
     } 
     catch(Exception e) { 
      JOptionPane.showMessageDialog(null, "Error! Enter a correct date"); 
     } 
    } while (dataCorrect == false); 
    JOptionPane.showMessageDialog(null, myDay + "-" + myMonth + "-" + myYear); 
} 

}

這是我自己定義的日期類代碼:

import java.text.SimpleDateFormat; 
import java.text.ParseException; 

public class date { 
private int day; 
private int month; 
private int year; 
private String userTravel; 

// Constructor 
public date(int d, int m, int y) { 
    setDate(d,m,y);  
} 

// Methods 
public void setDate(int d, int m, int y) { 
    setDay(d); 
    setMonth(m); 
    setYear(y); 
} 

public String formDate() { 
    userTravel = day + "-" + month + "-" + year; 
    return userTravel; 
} 

public boolean checkInputs(String inDate) { 
    if (inDate == null) 
     return false; 
    //set the format to use as a constructor argument 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 

    if (inDate.trim().length() != dateFormat.toPattern().length()) 
     return false; 

    dateFormat.setLenient(false); 

    try { 
     //parse the inDate parameter 
     dateFormat.parse(inDate.trim()); 
    } 
    catch (ParseException pe) { 
     return false; 
    } 
    return true; 
} 

public void setDay(int d) { 
    day = d; 
} 

public void setMonth(int m) { 
    month = m; 
} 

public void setYear(int y) { 
    year = y; 
} 

我也不能確定,如果該方法的代碼checkInputs是正確的。

編輯:我已經刪除了如下在答案中所述的IF語句,謝謝。 只是想問,如果有反正我可以強制用戶輸入一個四位數的年份YYYY總是或它將保持循環,直到發生這種情況

+0

那麼究竟是怎麼回事?你在期待什麼? – david99world 2013-03-27 12:45:14

+0

每當我運行它時,它都會陷入無限循環,要求我爲日,月和年。我期待它驗證一個日期,然後將其輸出到屏幕上。 – Khalid 2013-03-27 12:46:44

回答

1

您不一定需要檢查輸入日期String長度與日期格式模式:

if (inDate.trim().length() != dateFormat.toPattern().length()) 
    return false; 

例如,你可以有2-3-2013輸入日期,但你的模式是dd-MM-yyyy所以這2 Strings長度不匹配,返回從checkInputsfalse讓您在循環。當然,像10-12-2013這樣的日期不會造成無限循環。

只需使用自己的SimpleDateFormat進行解析即可提供所需的驗證。

+0

謝謝,我刪除了,如果聲明,它現在似乎工作。 – Khalid 2013-03-27 12:55:23

+0

也考慮[JCalendar](http://www.toedter.com/en/jcalendar/index.html)... – Reimeus 2013-03-27 13:02:24

+0

這似乎是一個非常整潔的功能,但我認爲這個代碼我會在我的錯誤處理/陷印功能。我認爲生病讓它保持現狀。謝謝 – Khalid 2013-03-27 13:05:47

1

方法checkInputs在這部分失敗:

if (inDate.trim().length() != dateFormat.toPattern().length()) 
    return false; 

如遇有天或月整數不具有兩位數字(1,2,3等..,9),所述長度inDate的長度不會等於模式長度。例如,日期日期1-1-2013有8個字符,而模式期望爲10.

我相信如果您刪除此條件,代碼將按預期工作。

+0

謝謝,現在好像工作。我可以問,有什麼方法可以強制用戶輸入四位數年份yyyy? – Khalid 2013-03-27 12:58:33

+0

沒有辦法使用JOptionPane輸入對話框。你應該使用一個swing掩碼輸入。 – viniciusjssouza 2013-03-27 13:08:37