Как представлять просто «время» с JodaTime - PullRequest
3 голосов
/ 07 января 2020

Я не уверен, как я могу объяснить только «время», поэтому я хочу начать с примера.
Когда я пишу плеер mov ie, я хочу представить время начала (00:00: 00) в миллисекундах как 0, и если текущая позиция кадра равна 5 минутам (00:05:00), это будет 300 000 (5 * 60 * 1000).
Меня не волнует часовой пояс, календарь или часы информация в реальном мире.

Однако JodaTime, например, Instant относится к Unixtime (на основе 1970), Interval, Duration и Period на Instant, а LocalTime на 24-часовой (что обеспечивает часовое поле до 1-24).

Конечно, я могу вручную анализировать "00:05:00" на 300 000, но мне интересно, как мне достичь этой цели с помощью JodaTime или другой библиотеки.

1 Ответ

4 голосов
/ 07 января 2020

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

...