Duration
Ваше утверждение о классе Duration
неверно. Вы сказали, что оно основано на Instant
, но нет, это не так.
A Duration
представляет промежуток времени , а не , привязанный к временной шкале. Duration
в Joda-Time - это просто подсчет миллисекунд. Этот факт изложен в его Javado c.
То же самое для Period
, который представляет промежуток времени, не привязанный к временной шкале в масштабе лет-месяцев-дней. A Duration
работает в масштабе часов-минут-секунд.
Для представления промежутка в пять минут:
Duration d = Duration.standardMinutes( 5 ) ;
Если вы хотите получить момент в будущем на это количество времени, добавьте эту продолжительность к текущему моменту.
Instant fiveMinutesInFuture = new Instant().plus( d ) ;
ISO 8601
Чтобы представить длительность в виде текста, используйте стандартный формат ISO 8601, с P
в начале и T
, отделяющим часть лет-месяцев-дней от часть часов-минут-секунд.
Итак, пять минут - это PT5M
.
String output = d.toString() ;
Разобрать такие строки ISO 8601.
Duration d = Duration.parse( "PT5M" ) ; // Five minutes.
Формат часов
Для сериализации объекта duration
в виде текста всегда используйте стандартный формат ISO 8601, а не формат часов.
Для представления в пользовательском интерфейсе я предлагаю вам не представлять промежуток времени с использованием нотации часов такие как 00:05:00
. Это сбивает с толку и неоднозначно для пользователей. Вместо этого используйте стандартные форматы ISO 8601, поскольку они разработаны, чтобы быть практичными и однозначными.
Если вы настаиваете на представлении длительности в формате часов, вызовите методы getStandard…
, чтобы получить часы, минуты и секунды.
String output =
String.format( "%02d", d.getStandardHours() ) +
":" +
String.format( "%02d", d.getStandardMinutes() ) +
":" +
String.format( "%02d", d.getStandardSeconds() )
;
00: 05: 00
Если продолжительность может превышать 24 часа, вам также необходимо позвонить getStandardDays
. Эти дни - просто куски времени продолжительностью 24 часа. Такими днями являются , а не календарных дней, поскольку Duration
не привязан к временной шкале.
java .time
Имейте в виду, что Joda-Time сейчас находится в режиме обслуживания. Его преемник, java .time , встроен в Java 8 и более поздние версии, а также Android 26+. Для Java 6 и 7 используйте ThreeTen-Backport . Для более ранних Android используйте ThreeTenABP .
Концепции такие же, как в java .time , как обсуждалось здесь. Класс java.time.Duration
очень похож, за исключением более тонкого разрешения наносекунд и немного другого синтаксиса.
Instant.now().plus(
Duration.ofMinutes( 5 )
)
Или:
Instant.now().plus(
Duration.parse( "PT5M" )
)
Чтобы создать чтение часов, вызовите to…Part
методы.
String output =
String.format( "%02d", d.toHoursPart() ) +
":" +
String.format( "%02d", d.toMinutesPart() ) +
":" +
String.format( "%02d", d.toSecondsPart() )
;
00: 05: 00