2015-08-25 17 views
7

mi piacerebbe validare diversi formati di data, come di seguito esempi:Convalida Java 8 risale

YYYY 
YYYY-MM 
YYYY-MM-DD 

convalida deve assicurare che il formato della data è corretta e la data esiste.

Sono a conoscenza del fatto che Java 8 fornisce una nuova API Date, quindi mi chiedo se è in grado di fare questo tipo di lavoro.

C'è un modo migliore di utilizzare l'API di data Java 8? È ancora buona norma utilizzare la classe Calendar con i parametri lenient?

+0

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

+1

Che cosa si aspetta come una data per "AAAA"? "YYYY-01-01"? Stessa domanda per "YYYY-MM". –

+2

Non è mai stata una buona pratica usare la classe 'Calendar'. 'DateFormat' è sempre stato quello da usare. – Kayaman

risposta

4

per convalidare il formato di YYYY-MM-DD, si può semplicemente utilizzare LocalDate.parse introdotto nel java.time dal JDK 8.

Ottiene un'istanza di LocalDate da una stringa di testo come 2007-12-03.

La stringa deve rappresentare una data valida ed è analizzata utilizzando DateTimeFormatter.ISO_LOCAL_DATE.

A DateTimeParseException verrà generata se la data non è valida.

Per gli altri due formati che ci hai fornito, l'eccezione sarebbe stata generata. Questo è logico perché non sono date reali, semplicemente parte di una data.


LocalDate anche fornire un metodo of(int year, int month, int dayOfMonth) quindi se si vuole veramente per convalidare semplicemente l'anno in alcuni casi, l'anno con il mese in altro caso o la data completa allora si potrebbe fare qualcosa di simile:

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; 
} 

si noti che è menzionate diversi formati ma non ha fornito loro, così ho assunto queste erano le uniche 3.

4

È possibile specificare i campi mancanti con parseDefaulting a fare la formattatori di lavoro:

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; 
}