Я пытаюсь написать метод для печати разницы во времени между двумя ZonedDateTime s, касающимися разницы между часовыми поясами.
Я нашел некоторые решения, но все они были написаны для работы с LocalDateTime.
Я пытаюсь написать метод для печати разницы во времени между двумя ZonedDateTime s, касающимися разницы между часовыми поясами.
Я нашел некоторые решения, но все они были написаны для работы с LocalDateTime.
Вы можете использовать метод между из 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.
Надеюсь, поможет.
Для часов, минут, секунд:
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 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
и другие.