2016-02-09 12 views
6

Kiedy to zrobićNie można uzyskać OffsetDateTime z TemporalAccessor

String datum = "20130419233512"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin")); 
OffsetDateTime datetime = OffsetDateTime.parse(datum, formatter); 

pojawia się następujący wyjątek:

java.time.format.DateTimeParseException: Text '20130419233512' could not be parsed: 
Unable to obtain OffsetDateTime from TemporalAccessor: {InstantSeconds=1366407312},ISO,Europe/Berlin resolved 
to 2013-04-19T23:35:12 of type java.time.format.Parsed 

Jak mogę analizować mój datetime ciąg tak, że jest on interpretowany jako zawsze jest z strefa czasowa "Europa/Berlin"?

Odpowiedz

6

Problemem jest to, że istnieje różnica pomiędzy tym, co jest i ZoneIdZoneOffset jest. Aby utworzyć OffsetDateTime, potrzebujesz przesunięcia strefy. Ale there is no one-to-one mapping between a ZoneId and a ZoneOffset, ponieważ tak naprawdę zależy od bieżącego czasu letniego. Dla tego samego ZoneId, jak "Europa/Berlin", istnieje jeden offset na lato i inny offset na zimę.

W tym przypadku łatwiej byłoby użyć numeru ZonedDateTime zamiast OffsetDateTime. Podczas analizowania The ZonedDateTime będzie prawidłowo ustawić do strefy id "Europe/Berlin" i offset zostaną również ustawione zgodnie z oszczędności czasu, w efekcie na dzień do analizowania światła:

public static void main(String[] args) { 
    String datum = "20130419233512"; 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin")); 
    ZonedDateTime datetime = ZonedDateTime.parse(datum, formatter); 

    System.out.println(datetime.getZone()); // prints "Europe/Berlin" 
    System.out.println(datetime.getOffset()); // prints "+02:00" (for this time of year) 
} 

Zauważ, że jeśli naprawdę chcesz OffsetDateTime , możesz użyć ZonedDateTime.toOffsetDateTime(), aby przekonwertować ZonedDateTime na OffsetDateTime.

+2

Podoba mi się, że robisz to w jednym kroku, a nie w dwóch, jak pokazałem. Opuszczę moją odpowiedź, ponieważ obie będą działać, ale polecam twoje na zielony znacznik wyboru. :) –

+0

Ponieważ potrzebuję OffsetDateTime używam teraz 'OffsetDateTime datetime = ZonedDateTime.parse (baza, formatter) .toOffsetDateTime();'. – asmaier

+1

@asmaier Tak, to też skomentowałem. Możesz użyć tego do konwersji na 'OffsetDateTime'. – Tunaki

1

W danych źródłowych nie ma przesunięcia, a zatem OffsetDateTime nie jest właściwym typem do użycia podczas analizowania.

Zamiast tego należy użyć LocalDateTime, ponieważ jest to typ najbardziej przypominający dane, które posiadasz. Następnie użyj atZone, aby przypisać mu strefę czasową, a jeśli nadal potrzebujesz OffsetDateTime, możesz tam wywołać toOffsetDateTime.

String datum = "20130419233512"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 
LocalDateTime datetime = LocalDateTime.parse(datum, formatter); 
ZonedDateTime zoned = datetime.atZone(ZoneId.of("Europe/Berlin")); 
OffsetDateTime result = zoned.toOffsetDateTime(); 
+0

Dzięki. To działa dla mnie. Jakoś założyłem, że metoda OffsetDateTime.parse() wykonałaby dla mnie te kroki wewnętrznie. – asmaier