Общее время полета между двумя часовыми поясами?

Если мы покинем Франкфурт в 14:05 и прибудем в Лос-Анджелес в 16:40. Как долго длится полет?

Я попробовал следующее:

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

Но я не могу получить успешный ответ, который составляет около 11 часов и 30 минут. Кто-нибудь, пожалуйста, помогите мне разобраться с проблемой выше. Спасибо вам:)

Ответ 1

getOffset - неправильный метод. Это получает смещение UTC для этой зоны в этот момент времени. Это не помогает определить фактическое время суток.

Один из способов - явно получить Instant, представленный каждым значением, используя toInstant. Затем используйте Duration.between для вычисления количества прошедшего времени.

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

В качестве альтернативы, поскольку Duration.between работает с объектами Temporal, и как Instant, так и ZonedDateTime реализует Temporal, вы можете просто вызвать Duration.between непосредственно на объекты ZonedDateTime:

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

И, наконец, есть ярлыки, как упоминается один атао, который хорош, если вы хотите получить прямо на единицу измерения, например, на полные секунды. Любое из них приемлемо.

Ответ 2

Заменить:

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

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

с:

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

ИЗМЕНИТЬ

Мне нравится более короткий (и самый короткий) ответ, данный Мэттом Джонсоном:

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