tl; др
Duration.between(
LocalTime.of( 12 , 5 , 0 ) ,
LocalTime.of( 12 , 7 , 0 )
).toString()
PT2M
Если, вопреки моей настоятельной рекомендации использовать Duration
, вы настаиваете на использовании двусмысленного / запутанного времениформатирование дня:
LocalTime.MIN.plus(
Duration.between(
LocalTime.of( 12 , 5 , 0 ) ,
LocalTime.of( 12 , 7 , 0 )
)
).toString();
00: 02
Для принудительного применения всех трех компонентов (часы, минуты, секунды) используйте предопределенный DateTimeFormatter.ISO_LOCAL_TIME
.
LocalTime.MIN.plus(
Duration.between(
LocalTime.of( 12 , 5 , 0 ) ,
LocalTime.of( 12 , 7 , 0 )
)
).format( DateTimeFormatter.ISO_LOCAL_TIME )
00: 02: 00
См. живой код в IdeOne.com .
Момент! = Span-of-time
Не злоупотребляйте классом даты и времени, таким как java.util.Date
, для хранения прошедшего времени.Такой класс представляет момент, а не промежуток времени.
Избегайте устаревших классов даты и времени
Не используйте проблемные старые классы даты и времени, такие как java.util.Date
.Теперь они заменяются классами java.time.
Instant
Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд .
Получить текущий момент.
Instant now = Instant.now();
Имитация на более позднее время.
Instant future = now.plus( Duration.ofMinutes( 5 ) );
Duration
Время, затраченное на захват объекта Duration
или Period
.Каждый из них представляет промежуток времени, первый обрабатывает дни-часы-минуты-секунды, а второй - годы-месяцы-дни.
Duration duration = Duration.between( now , future );
Формат строки
Для представления этой продолжительностизначение в виде строки, не используйте форматирование времени дня, поскольку это неоднозначно.Вместо этого используйте стандартный ISO 8601 формат для продолжительности .Этот формат, PnYnMnDTnHnMnS
, отмечает начало с P
.T
в середине отделяет часть лет-месяцев-дней от части часов-минут-секунд.Например, два с половиной часа - это PT2H30M
.Наш пример из пяти минут: PT5M
.
String output = duration.toString(); // PT5M
LocalTime
Если у вас есть фактическое время суток и вы хотите отформатировать с нулями заполнения, используйтеформат по умолчанию LocalTime::toString
.
LocalTime.now( ZoneId.of( "America/Montreal" ) ).toString(); // 02:03:04.789Z
Другой пример.Опять же, я не рекомендую злоупотреблять LocalTime
таким образом.(Вместо этого используйте Duration
в течение истекшего времени.)
LocalTime start = LocalTime.now( ZoneId.of( "America/Montreal" ) );
LocalTime stop = start.plusMinutes( 7 );
Duration d = Duration.between( start , stop );
LocalTime result = LocalTime.MIN.plus( d ); // I do *not* recommend abusing `LocalTime` this way. Use `Duration` instead for elapsed time.
DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_TIME ;
String output = result.format( f );
System.out.println( "output: " + output );
вывод: 00: 07: 00
См. живой код в IdeOne.com .
О 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
- Android
Проект ThreeTen-Extra расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .