2016-07-15 100 views
7

ho il modello "ggmmaa" nel mio codice ho specificato utilizzando i metodi appendValue:Java8 appendPattern vs modello definito con metodi appendValue produce risultato diverso

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder() 
        .appendValue(ChronoField.DAY_OF_MONTH, 2) 
        .appendValue(ChronoField.MONTH_OF_YEAR, 2) 
        .appendValue(ChronoField.YEAR_OF_ERA, 2) 
        .toFormatter(); 
System.out.println(LocalDate.parse("100199", dateTimeFormatter)); 

Tuttavia questo produce "0099" per l'anno:

0099-01-10

Se cambio che a utilizzare l'appendPattern così:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder() 
        .appendPattern("ddMMyy") 
        .toFormatter(); 
System.out.println(LocalDate.parse("100199", dateTimeFormatter)); 

Ho il risultato corretto per l'anno "2099" con secolo in esso.

2099-01-10

Il codice sembra equivalente per me perché non è fatto allo stesso risultato? Perché il secolo manca nel primo caso?

risposta

6

Perché appendValue prende l'anno in quanto viene passato senza ulteriori manipolazioni - nel vostro caso 99.

Se si vuole iniziare da un "anno di riferimento", dicono 2000 e aggiungere il valore a quello dell'anno base (per ottenere 2099) è possibile utilizzare appendValueReduced invece:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder() 
     .appendValue(ChronoField.DAY_OF_MONTH, 2) 
     .appendValue(ChronoField.MONTH_OF_YEAR, 2) 
     .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.of(2000, 1, 1)) 
     .toFormatter(); 

Quando si utilizza il modello yy, si ottiene che il comportamento di default come descritto nella the javadoc:

Anno: il conteggio delle lettere determina la larghezza minima del campo al di sotto della quale viene utilizzato il riempimento. Se il conteggio delle lettere è due, viene utilizzato un modulo a due cifre ridotto. Per la stampa, questo produce le due cifre più a destra. Per l'analisi, questo verrà analizzato utilizzando il valore di base di 2000, risultante in un anno compreso tra 2000 e 2099 inclusi. [...]

Problemi correlati