2015-11-28 9 views
10

Wenn wir Frankfurt um 14:05 verlassen und um 16:40 in Los Angeles ankommen. Wie lange dauert der Flug?Gesamtflugzeit zwischen zwei Zeitzonen?

Ich habe versucht, die folgenden:

ZoneId frank = ZoneId.of("Europe/Berlin"); 
ZoneId los = ZoneId.of("America/Los_Angeles"); 

LocalDateTime dateTime = LocalDateTime.of(2015, 02, 20, 14, 05); 
LocalDateTime dateTime2 = LocalDateTime.of(2015, 02, 20, 16, 40); 

ZonedDateTime berlinDateTime = ZonedDateTime.of(dateTime, frank); 
ZonedDateTime losDateTime2 = ZonedDateTime.of(dateTime2, los); 

int offsetInSeconds = berlinDateTime.getOffset().getTotalSeconds(); 
int offsetInSeconds2 = losDateTime2.getOffset().getTotalSeconds(); 

Duration duration = Duration.ofSeconds(offsetInSeconds - offsetInSeconds2); 
System.out.println(duration); 

Aber ich bin nicht in der Lage die erfolgreiche Antwort zu erhalten, die über 11hrs und 30min ist. Kann mir jemand helfen, das Problem zu lösen? Danke dir :)

Antwort

10

getOffset ist die falsche Methode. Dadurch wird der UTC-Offset für diese Zone zu diesem Zeitpunkt ermittelt. Es hilft nicht, die tatsächliche Uhrzeit zu bestimmen.

Eine Möglichkeit besteht darin, explizit die Instant durch jeden Wert dargestellt, mit toInstant. Verwenden Sie dann Duration.between, um die verstrichene Zeit zu berechnen.

Instant departingInstant = berlinDateTime.toInstant(); 
Instant arrivingInstant = losDateTime2.toInstant(); 
Duration duration = Duration.between(departingInstant, arrivingInstant); 

Alternativ kann, da Duration.between Arbeiten auf Temporal Objekte und sowohl Instant und ZonedDateTimeTemporal implementieren, können Sie einfach Duration.between rufen direkt an den ZonedDateTime Objekte:

Duration duration = Duration.between(berlinDateTime, losDateTime2); 

Und schließlich gibt es Verknüpfungen wie die Ein Atao erwähnt, dass es in Ordnung ist, wenn Sie direkt auf eine Maßeinheit wie z. B. ganze Sekunden kommen möchten. Irgendwelche von diesen sind annehmbar.

+0

danke @ Matt für die große Erklärung und wird im Auge behalten t Schläuche Sachen in der Zukunft \ ,,/ –

6

ersetzen:

int offsetInSeconds = berlinDateTime.getOffset().getTotalSeconds(); 
int offsetInSeconds2 = losDateTime2.getOffset().getTotalSeconds(); 

Duration duration = Duration.ofSeconds(offsetInSeconds - offsetInSeconds2); 

mit:

long seconds = ChronoUnit.SECONDS.between(berlinDateTime, losDateTime2); 
Duration duration = Duration.ofSeconds(seconds); 

EDIT

Ich mag die kürzere (und kürzeste) Antwort von Matt Johnson gegeben:

Duration duration = Duration.between(berlinDateTime, losDateTime2); 
+0

Keine Notwendigkeit für Sie, sich über Gesamtsekunden zu sorgen, keine Notwendigkeit, 'getTotalSeconds' zu nennen. Lassen Sie 'Duration' das für Sie arbeiten. Siehe die andere Antwort von Johnson für ein Beispiel. –

Verwandte Themen