Подтвердить что ты не робот

Java 8: вычислить разницу между двумя ZonedDateTime

Я пытаюсь написать метод для печати разницы во времени между двумя ZonedDateTime s, касающимися разницы между часовыми поясами.

Я нашел некоторые решения, но все они были написаны для работы с LocalDateTime.

4b9b3361

Ответ 1

Вы можете использовать метод между из ChronoUnit.

Этот метод преобразует это время в ту же зону (зону из первого аргумента) и после этого вызывает до тех пор, пока метод не объявлен в интерфейсе Temporal:

static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

Поскольку и ZonedDateTime, и LocalDateTime реализуют интерфейс Temporal, вы также можете написать универсальный метод для этих типов даты и времени:

static long dateTimeDifference(Temporal d1, Temporal d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

Но имейте в виду, что вызов этого метода для смешанных LocalDateTime и ZonedDateTime приводит к исключению DateTimeException.

Надеюсь, поможет.

Ответ 2

ТЛ; др

Для часов, минут, секунд:

Duration.between( zdtA , zdtB )

По годам, месяцам, дням:

Period.between( 
    zdtA.toLocalDate() , 
    zdtB.toLocalDate() 
)

подробности

Ответ Михала S правильный, показывая ChronoUnit.

Duration и Period

Другой маршрут - классы Duration и Period. Используйте первое для более коротких промежутков времени (часы, минуты, секунды), второе для более длинных (годы, месяцы, дни).

Duration d = Duration.between( zdtA , zdtB );

Создайте строку в стандартном формате ISO 8601, вызвав toString. Формат PnYnMnDTnHnMnS где P отмечает начало, а T разделяет две части.

String output = d.toString();

В Java 9 и более поздних версиях вызывайте методы to to…Part для получения отдельных компонентов. Обсуждается в другом моем ответе.

Пример кода

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtStart = ZonedDateTime.now( z );
ZonedDateTime zdtStop = zdtStart.plusHours( 3 ).plusMinutes( 7 );

Duration d = Duration.between( zdtStart , zdtStop );

2016-12-11T03: 07: 50.639-05: 00 [Америка/Монреаль]/2016-12-11T06:14:50.639-05:00 [Америка/Монреаль]

PT3H7M

Смотрите живой код в IdeOne.com.

Interval & LocalDateRange

Проект ThreeTen-Extra добавляет функциональность в классы java.time. Одним из его удобных классов является Interval для представления промежутка времени в виде пары точек на временной шкале. Другим является LocalDateRange, для пары объектов LocalDate. Напротив, каждый из классов Period и Duration представляет промежуток времени, не привязанный к временной шкале.

Заводской метод для Interval принимает пару объектов Instant.

Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );

Вы можете получить Duration от Interval.

Duration d = interval.toDuration();

О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытеснять неприятные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, и SimpleDateFormat.

Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.

Чтобы узнать больше, смотрите Oracle Tutorial. И поиск для многих примеров и объяснений. Спецификация JSR 310.

Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*.

Где взять классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и другие.