2015-07-30 14 views
9

Mam kod Java, który wprowadza datę w określonym formacie.Dlaczego SimpleDateFormat.parse akceptuje niepoprawny ciąg daty?

static Date parseDate(String userInput){ 
     DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     Date date = null; 
     try { 
      date = format.parse(userInput); 
      System.out.println(date); 
     }catch(ParseException pe){ 
      date=null; 
      System.out.println("Not a valid date"); 
     } 
     return date; 
    } 

Teraz wprowadzam 2015-13-11 89:90:90, która jest nieprawidłową datą. Ale zwraca jako datę Thu Jan 14 18:31:30 IST 2016. Dlaczego tak jest? Jak sprawić, by zwracała wartość null jako datę?

+0

Okay, przegapiłem, że źle to wprowadziłeś;) – DigitalNinja

Odpowiedz

14

Od skrócie o javadocs, wydaje się być za pomocą lenient tryb analizowania, w którym akceptuje źle sformatowaną wejściowe:

Dodanie tej linii

format.setLenient(false); 

po inicjalizacji Twojego obiektu dateformat wydaje się to naprawić.

+0

To pomaga, dzięki. – inquisitive

4

Spróbuję wytłumaczyć, , dlaczego tak się dzieje.

Data jest inna, ponieważ wartości, które przekraczają maksimum ich pól, są zwinięte do następnego większego pola.

nie jestem pewien porządek, w jakim jest to rozwiązane, ale tutaj jest to, co się dzieje w ogóle:

Biorąc 2015-13-11 89:90:90

  1. rok jest interpretowana jako 2015, który jest ustawiony prawidłowo. Obecnie 2015-01-01 00:00:00
  2. Miesiąc jest interpretowany jako 13, 13/MONTHS_IN_A_YEAR = 1, więc dodajemy rok i ustawiamy miesiąc na 1 (13 miesięcy - 1 rok). Obecnie 2016-01-01 00:00:00
  3. Data jest interpretowana jako 11. Jest poprawnie ustawiona. Obecnie 2016-01-11 00:00:00
  4. Godzina jest interpretowana 89, 89/HOURS_IN_A_DAY = 3, więc dodano 3 dni i ustawiliśmy godzinę na 17 (89 godzin - 3 dni). Obecnie 2016-01-14 17:00:00
  5. Minuta jest interpretowana jako 90, 90/MINUTES_IN_A_HOUR = 1, więc dodano 1 godzinę, a my ustawiamy minuty na 30 (90 minut - 1 godzina). Obecnie 2016-01-14 18:30:00
  6. Druga interpretowana jest jako 90, 90/SECONDS_IN_A_MINUTE = 1, więc dodano 1 minutę, a my ustawiamy sekundy na 30 (90 sekund - 1 minuta).

To pozostawi nas w dniu 2016-01-14 18:31:30.

Powiązane problemy