tl;dr
Преобразуйте устаревшие 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 и более поздние версии заменяют неудобные старые классы _11 _ / _ 12_. Новые классы вдохновлены очень успешной структурой Joda-Time, которая должна стать ее преемницей, аналогичной по концепции, но с новой архитектурой. Определено JSR 310. Расширен проектом ThreeTen-Extra. См. Руководство.
Момент
Класс Instant
представляет момент на временной шкале. в UTC с разрешением наносекунды (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Лучше избегать устаревших классов, таких как _15 _ / _ 16_. Но если вам необходимо взаимодействовать со старым кодом, который еще не обновлен до java.time, конвертируйте туда и обратно. Вызов новых методов преобразования, добавленных к старым классам. Для перехода от java.util.Date
к _ 18_, позвоните _ 19_.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Промежуток времени
Классы java.time разделили идею представления промежутка времени в виде числа лет, месяцев, дней, часов, минут, секунд на две половины:
Period
для лет, месяцев, дней
Duration
для дней, часов, минут, секунд.
Вот пример.
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
Если вас интересует только более простая и крупная детализация времени, например «количество прошедших дней», используйте _ 34_ перечисление.
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 и новее. Эти классы заменяют неудобные старые устаревшие классы даты и времени, такие как _ 37_, _ 38_, & _ 39_.
Проект Joda-Time теперь в режим обслуживания, советует перейти на java.time.
Чтобы узнать больше, см. Учебник Oracle. И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310.
Где взять классы java.time?
- Java SE 8 and SE 9 and later
- Built-in.
- Часть стандартного Java API со встроенной реализацией.
- В Java 9 добавлены некоторые незначительные функции и исправления.
- Java SE 6 and SE 7
- Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
- Android
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, например _40 _, YearWeek
, _ 42_ и подробнее.
Джода-Тайм
ОБНОВЛЕНИЕ: проект 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
person
Basil Bourque
schedule
23.03.2014
Date
,Calendar
иSimpleDateFormat
». - person Basil Bourque   schedule 26.10.2016java.time.Period
и / илиDuration
. См. ответ Базиля Бурка ниже. - person Ole V.V.   schedule 16.02.2017