2015-11-28 16 views
10

Se lasciamo Francoforte alle 14:05 e arriva a Los Angeles alle 16:40. Quanto è lungo il volo?Tempo totale di volo tra due fusi orari?

ho provato il seguito:

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

ma io non sono in grado di ottenere la risposta di successo che è di circa 11ore e 30min. Qualcuno può aiutarmi a capire il problema sopra. Grazie :)

risposta

10

getOffset è il metodo sbagliato. In questo modo viene generato l'offset UTC per quella zona in quel momento. Non aiuta a determinare l'ora esatta del giorno.

Un modo è quello di ottenere esplicitamente il valore Instant rappresentato da ciascun valore, utilizzando toInstant. Quindi utilizzare Duration.between per calcolare la quantità di tempo trascorso.

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

In alternativa, dal momento che Duration.between opere Temporal oggetti, ed entrambi Instant e ZonedDateTime implementare Temporal, si può chiamare Duration.between direttamente sulle ZonedDateTime oggetti:

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

E, infine, ci sono scorciatoie come il uno ha detto che va bene se vuoi arrivare direttamente a un'unità di misura come il totale dei secondi. Ognuno di questi è accettabile.

+0

grazie @ opaco per la grande spiegazione e terrò a mente t cose flessibili in futuro \ ,,/ –

6

Sostituire:

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

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

con:

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

EDIT

mi piace più breve (e più breve) risposta data da Matt Johnson:

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

Non c'è bisogno che ti preoccupi dei secondi totali, non c'è bisogno di chiamare 'getTotalSeconds'. Lascia che 'Duration' faccia quel lavoro per te. Vedi l'altra risposta di Johnson per un esempio. –