2016-01-15 21 views
8

Ho bisogno di analizzare una stringa nel seguente formato 2015-01-15-05:00 in LocalDate (o altro ancora) in UTC. Il problema è che il codice seguente:Analisi della data di scostamento Java 8

System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE)); 

uscite 2015-01-15 ignorando l'offset. L'output desiderato è 2015-01-16

Grazie in anticipo!

+1

Perché pensi che il risultato debba essere il 2015-01-16? Ovviamente fai una supposizione incalcolabile su come deve essere il tempo dell'orologio inesistente (sempre uguale per tutte le tue stringhe di input ???). Per me, la data è analizzata: 15-01-2015. Non c'è connessione a UTC a causa della mancanza di tempo. –

risposta

7

La risposta più semplice è quello di utilizzare OffsetDateTime per rappresentare i dati, ma è necessario per difetto il tempo:

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
    .append(DateTimeFormatter.ISO_OFFSET_DATE) 
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
    .toFormatter(); 
OffsetDateTime dt = OffsetDateTime.parse("2015-01-15-05:00", fmt); 
LocalDate date = dt.withOffsetSameInstant(ZoneOffset.UTC).toLocalDate(); 

ZonedDateTime è utile se si occupano di fusi orari, ma quando si tratta solo di offset, OffsetDateTime è più semplice.

In generale, il codice dell'applicazione non deve contenere variabili di tipo TemporalAccessor. Se lo vedi, generalmente c'è un modo migliore.

+2

Diretto e autorevole. Grazie per la guida! –

+0

@JodaStephen, esce ancora 2015-01-15 – StasKolodyuk

+0

@JodaStephen, dovrebbe essere .parseDefaulting (ChronoField.HOUR_OF_DAY, 24) – StasKolodyuk

2

Sembra che abbia trovato un'anima. Eccolo:

TemporalAccessor temporalAccessor = DateTimeFormatter.ISO_OFFSET_DATE.parse("2015-01-15-05:00"); 
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.from(temporalAccessor), LocalTime.MAX, ZoneId.from(temporalAccessor)); 
System.out.println(zonedDateTime.withZoneSameInstant(ZoneOffset.UTC).toLocalDate());