Я намагаюся написати метод для друку різниці в часі між двома ZonedDateTime , щодо різниці між часовими поясами.
Я знайшов кілька рішень, але всі вони були написані для роботи з LocalDateTime .
Я намагаюся написати метод для друку різниці в часі між двома ZonedDateTime , щодо різниці між часовими поясами.
Я знайшов кілька рішень, але всі вони були написані для роботи з LocalDateTime .
Відповіді:
Ви можете використовувати метод між з ChronoUnit .
Цей метод перетворює ці часи в одну і ту ж зону (зона з першого аргументу), а після цього викликає, поки метод не оголошений у тимчасовому інтерфейсі:
static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){
return unit.between(d1, d2);
}
Оскільки і ZonedDateTime, і LocalDateTime реалізують тимчасовий інтерфейс, ви також можете написати універсальний метод для тих типів дати та часу:
static long dateTimeDifference(Temporal d1, Temporal d2, ChronoUnit unit){
return unit.between(d1, d2);
}
Але майте на увазі, що виклик цього методу для змішаних LocalDateTime і ZonedDateTime веде до DateTimeException .
Сподіваюся, це допоможе.
Duration.between( zdtA , zdtB )
як показано в моїй відповіді . Я думаю, between
метод просто закликає ZonedDateTime::toInstant()
до обох.
Години, хвилини, секунди:
Duration.between( zdtA , zdtB ) // Represent a span-of-time in terms of days (24-hour chunks of time, not calendar days), hours, minutes, seconds. Internally, a count of whole seconds plus a fractional second (nanoseconds).
Роками, місяцями, днями:
Period.between( // Represent a span-of-time in terms of years-months-days.
zdtA.toLocalDate() , // Extract the date-only from the date-time-zone object.
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…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 . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .
Ви можете обмінювати об'єкти java.time безпосередньо з базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або новішою. Не потрібно рядків, не потрібноjava.sql.*
класи.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є полігоном для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .
of
метод тривалості, який займає два моменти? Я тільки бачуpublic static Duration of(long amount, TemporalUnit unit)
.of
на .between
. Дякую.