Общее время полета между двумя часовыми поясами?
Если мы покинем Франкфурт в 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);