ТЛ; др
Преобразуйте ваши устаревшие java.util.Date
объекты в их замену java.time.Instant
. Затем вычислите прошедшее время как Duration
.
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString (): PT2H34M56S
d.toMinutes (): 154
d.toMinutesPart (): 34
Формат ISO 8601: PnYnMnDTnHnMnS
Разумный стандарт ISO 8601 определяет краткое текстовое представление промежутка времени в виде числа лет, месяцев, дней, часов и т. Д. Стандарт называет такой промежуток длительностью . Формат - это то, PnYnMnDTnHnMnS
где P
означает «Период», T
отделяет часть даты от части времени, а между ними находятся цифры, за которыми следует буква.
Примеры:
P3Y6M4DT12H30M5S
три года, шесть месяцев, четыре дня, двенадцать часов, тридцать минут и пять секунд
PT4H30M
Четыре с половиной часа
java.time
Среда java.time, встроенная в Java 8 и более поздние, заменяет проблемные старые java.util.Date
/ java.util.Calendar
классы. Новые классы вдохновлены очень успешной платформой Joda-Time , задуманной как ее преемник, похожей по концепции, но реструктурированной. Определено JSR 310 . Продлевался ThreeTen-Extra проекта. Смотрите учебник .
момент
Instant
Класс представляет собой момент на временной шкале в формате UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Лучше всего избегать устаревших классов, таких как Date
/ Calendar
. Но если вам нужно взаимодействовать со старым кодом, который еще не обновлен до java.time , конвертируйте туда и обратно. Вызовите новые методы преобразования, добавленные к старым классам. Для перехода от java.util.Date
к Instant
, позвоните Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Промежуток времени
Классы java.time разделили эту идею представления промежутка времени в виде количества лет, месяцев, дней, часов, минут, секунд на две половины:
Вот пример.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Дамп на консоль.
Оба Period
и Duration
используют стандарт ISO 8601 для генерации строкового представления их значения.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
сейчас: 2015-11-26T00: 46: 48.016-05: 00 [Америка / Монреаль] до будущего: 2015-11-26T00: 46: 48.016-05: 00 [Америка / Монреаль] = PT1H3M
Java 9 добавляет методы для Duration
получения части дней, часов, минут и секунд.
Вы можете получить общее количество дней, часов, минут, секунд, миллисекунд или наносекунд за всю продолжительность.
long totalHours = duration.toHours();
В Java 9 Duration
класс получает новые методы для возврата различных частей дней, часов, минут, секунд, миллисекунд / наносекунд. Назовите to…Part
методы: toDaysPart()
, toHoursPart()
и так далее.
ChronoUnit
Если вы заботитесь только о более простой детализации времени, такой как «количество прошедших дней», используйте ChronoUnit
перечисление.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Другой пример.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time.
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где взять классы java.time?
- Java SE 8 и SE 9 и позже
- Встроенный.
- Часть стандартного Java API с комплексной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
- Android
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .
Joda времени
ОБНОВЛЕНИЕ: проект Joda-Time сейчас находится в режиме обслуживания , и команда рекомендует переход на java.time. классы . Я оставляю этот раздел нетронутым для истории.
Библиотека Joda-Time использует ISO 8601 по умолчанию. Его Period
класс анализирует и генерирует эти строки PnYnMnDTnHnMnS.
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
Оказывает:
period: PT4H30M