2016-01-15 14 views
8

Potrzebuję parsować String w następującym formacie 2015-01-15-05:00 do LocalDate (lub coś jeszcze) w UTC. Problemem jest to, że w następnym kodem:Java 8 Offset Date Parsing

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

wyjścia 2015-01-15 ignorując przesunięcia. Wymagana moc wyjściowa to 2015-01-16

Z góry dziękuję!

+1

Dlaczego według Ciebie wynik musi być 2015-01-16? Oczywiście robisz niezliczone założenie o tym, jak powinien wyglądać nieistniejący zegar (zawsze taki sam dla wszystkich twoich ciągów wejściowych ???). Dla mnie data jest dokładnie taka sama: 2015-01-15. Nie ma połączenia z UTC z powodu brakującej części czasu. –

Odpowiedz

7

Najprostszym rozwiązaniem jest użycie OffsetDateTime do reprezentowania danych, ale trzeba domyślny czas:

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 jest przydatna, gdy do czynienia z strefach czasowych, ale kiedy masz do czynienia tylko z offsetami, OffsetDateTime jest prostsze.

Ogólnie kod aplikacji nie powinien zawierać zmiennych typu TemporalAccessor. Jeśli to widzisz, ogólnie jest lepszy sposób.

+2

Bezpośredni i autorytatywny. Dzięki za wskazówki! –

+0

@JodaStephen, nadal wysyła 2015-01-15 – StasKolodyuk

+0

@JodaStephen, powinno to być .parseDefaulting (ChronoField.HOUR_OF_DAY, 24) – StasKolodyuk

2

Wygląda na to, że znalazłem duszę. Oto ona:

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());