2015-07-27 28 views
5

Próbuję użyć tej funkcji, ale nie działa z tym przypadkiem '12/05/201a 'ktoś wie, dlaczego tak się stało?SimpleDateFormat nie działa zgodnie z oczekiwaniami

W moim teście używam tego System.out.println(isThisDateValid("12/05/201a", "dd/MM/yyyy"));, a odpowiedź brzmiała: true, ale oczekiwano, że wynik będzie fałszywy, ponieważ rok zawiera litery.

public static boolean isThisDateValid(String dateToValidate, String dateFromat) 
    { 

     if (dateToValidate == null) 
     { 
      return false; 
     } 

     SimpleDateFormat sdf = new SimpleDateFormat(dateFromat); 
     sdf.setLenient(false); 

     try 
     { 

      //if not valid, it will throw ParseException 
      Date date = sdf.parse(dateToValidate); 
      System.out.println(date); 

     } catch (ParseException e) 
     { 

      e.printStackTrace(); 
      return false; 
     } 

     return true; 
    } 
+0

jego zajmuje '201' dla' roku'. Jeśli umieścisz wszystkie litery w miejscu roku, nie będzie parsować. Ponieważ oczekuje cyfry "1" zamiast "roku". – Satya

+0

Oczekuje co najmniej jednej cyfry zamiast "roku". – Satya

+0

@Reimeus: 'SimpleDateFormat' nie * ignoruje * liter, po prostu nie zużywa całego ciągu znaków. Oto przykład nie ignorowania liter: http://ideone.com/gnbTwy –

Odpowiedz

12

DateFormat#parse niekoniecznie używać cały ciąg:

Analizuje tekst od początku danego łańcucha produkować datę. Ta metoda może nie używać całego tekstu podanego ciągu.

(podkr)

SimpleDateFormat's docs mówią nam, że yyyy nie musi oznaczać to będzie wymagało cztery cyfry roku:

Rok:

..

  • Do parsowania, jeśli liczba liter wzorca jest większa niż 2, rok jest interpretowany dosłownie, niezależnie od liczby cyfr. Więc za pomocą wzoru "MM/dd/yyyy", "01/11/12" przetwarza do 11 stycznia 12 AD

tak jest prawidłowe (jeśli ewentualnie zaskakujące), który analizuje ten ciąg w roku 201.

Można użyć parse(String,ParsePosition) figury się, czy cały ciąg został zużyty, lub sprawdź go za pomocą wyrażenia regularnego przed analizą. Oto wersja, która sprawdzi, czy cały ciąg został sparsowany, a nie tylko pierwsze znaki:

public static boolean isThisDateValid(String dateToValidate, String dateFormat) { 
    if (dateToValidate == null) { 
     return false; 
    } 

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
    sdf.setLenient(false); 

    ParsePosition position = new ParsePosition(0); 
    Date date = sdf.parse(dateToValidate, position); 
    return date != null && position.getIndex() == dateToValidate.length(); 
}