2015-08-25 16 views
7

Ich mag würde mehrere Datumsformate validieren, wie im folgenden Beispielen:Validieren von Java 8 Daten

YYYY 
YYYY-MM 
YYYY-MM-DD 

Validation muss sicherstellen, dass das Datumsformat korrekt ist und das Datum existiert.

Ich bin mir bewusst, dass Java 8 eine neue Date API bietet, also frage ich mich, ob es in der Lage ist, solche Aufgaben zu erledigen.

Gibt es einen besseren Weg mit Java 8 Date API? Ist es immer noch eine gute Übung, die Calendar-Klasse mit lenient-Parameter zu verwenden?

+0

http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html – arodriguezdonaire

+1

Was möchten Sie als Datum für „YYYY“ erwarten? "JJJJ-01-01"? Gleiche Frage für "YYYY-MM". –

+2

Es war nie eine gute Übung, die 'Kalender' Klasse zu verwenden. 'DateFormat' war immer das zu verwendende. – Kayaman

Antwort

4

das YYYY-MM-DD Format Zur Validierung Sie einfach LocalDate.parse in java.time seit JDK 8 eingeführt können

Ermitteln eine Instanz von LOCALDATE aus einer Textzeichenfolge wie 2007-12-03.

Die Zeichenfolge muss ein gültiges Datum darstellen und wird unter Verwendung von DateTimeFormatter.ISO_LOCAL_DATE analysiert.

A DateTimeParseException wird ausgelöst, wenn das Datum ungültig ist.

Für die anderen zwei Formate, die Sie uns gaben, würde die Ausnahme geworfen werden. Das ist logisch, denn sie sind kein echtes Datum, sondern nur ein Teil eines Datums.


LOCALDATE auch ein Verfahren of(int year, int month, int dayOfMonth) also, wenn Sie wirklich nur das Jahr, in einigen Fällen überprüfen möchten, das Jahr mit dem Monat, in anderen Fällen oder das vollständige Datum dann könnte man so etwas tun:

public static final boolean validateInputDate(final String isoDate) 
{ 
    String[] dateProperties = isoDate.split("-"); 

    if(dateProperties != null) 
    { 
     int year = Integer.parseInt(dateProperties[0]); 

     // A valid month by default in the case it is not provided. 
     int month = dateProperties.length > 1 ? Integer.parseInt(dateProperties[1]) : 1; 

     // A valid day by default in the case it is not provided. 
     int day = dateProperties.length > 2 ? Integer.parseInt(dateProperties[2]) : 1; 

     try 
     { 
      LocalDate.of(year, month, day); 
      return true; 
     } 
     catch(DateTimeException e) 
     { 
      return false; 
     } 
    } 

    return false; 
} 

Beachten Sie, dass Sie erwähnt mehrere Formate sie aber nicht liefern, so nahm ich das waren die einzige 3.

4

können Sie angeben Felder mit parseDefaulting zu fehlen machen den Formatierer Arbeits:

public static boolean isValid(String input) { 
    DateTimeFormatter[] formatters = { 
      new DateTimeFormatterBuilder().appendPattern("yyyy") 
        .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1) 
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) 
        .toFormatter(), 
      new DateTimeFormatterBuilder().appendPattern("yyyy-MM") 
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) 
        .toFormatter(), 
      new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd") 
        .parseStrict().toFormatter() }; 
    for(DateTimeFormatter formatter : formatters) { 
     try { 
      LocalDate.parse(input, formatter); 
      return true; 
     } catch (DateTimeParseException e) { 
     } 
    } 
    return false; 
}