2016-07-11 35 views
8

Ho la seguente formattazione:DateTimeFormatterBuilder i conflitti parseDefaulting specificati per campo ANNO

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
     .appendPattern("yyyyMM") 
     .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) 
     .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) 
     .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
     .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) 
     .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1) 
     .parseDefaulting(ChronoField.YEAR, ZonedDateTime.now().getYear()) 
     .toFormatter() 
     .withZone(ZoneId.systemDefault()); 

cerco di analizzare la stringa "201505"

System.out.println(ZonedDateTime.parse("201505", formatter)); 

e viene generata un'eccezione:

Causato da: java.time.DateTimeException: Conflitto trovato: anno 2016 diverso dall'anno 2015

Funziona se commento l'impostazione del valore predefinito per ANNO.

Per quanto ho capito la documentazione, dovrebbe solo provare a sostituire il valore predefinito se non è stato analizzato alcun valore. Sembra che funzioni per un mese perché ho un mese diverso da quello predefinito analizzato. Tuttavia non funziona per anni.

Sto usando male qualcuno potrebbe dirmi se c'è un modo diverso per definire i valori di default per i campi che potrebbero non essere presenti in un modello?

+2

Perché si desidera analizzare l'input nel formato "aaaaMM" a "ZonedDateTime' e non a" YearMonth'? –

+0

Ho un codice che analizza diversi formati ci sono 40-50 diversi modelli che il formattatore riceve. Volevo utilizzare un formattatore generale per l'analisi che risulta sempre un ZonedDateTime. Questo è solo uno dei casi che ho. –

+0

Oh davvero 40-50 modelli? Hai anche localizzazioni diverse? Che dire delle prestazioni? Deve essere negativo a causa dell'eccezione/tiro di eccezione interna. Puoi per favore segnalare la tua esperienza di velocità? –

risposta

8

Il problema è che la lettera di modello "y" si riferisce a ChronoField.YEAR_OF_ERA, non ChronoField.YEAR. Basta cambiare l'ultima linea di parseDefaulting:

.parseDefaulting(ChronoField.YEAR_OF_ERA, ZonedDateTime.now().getYear()) 

e dovrebbe funzionare.

+3

Sì, funziona, grazie! –

Problemi correlati