ТЛ; др
Нет необходимости определять свой собственный класс Duration
, поскольку Java предоставляет его.
Duration.between ( // Represent a span of time of hours, minutes, seconds.
LocalTime.MIN , // 00:00:00
LocalTime.parse ( "08:30:00" ) // Parse text as a time-of-day.
) // Returns a `Duration` object, a span-of-time.
.toString() // Generate a `String` with text in standard ISO 8601 format.
PT8H30M
И анализировать стандартный форматированный текст ISO 8601.
Duration.parse( "PT8H30M" ) // Parse standard ISO 8601 text yo get a `Duration` object.
Избегать HH:MM:SS
формат
Если под строкой 08:30:00
вы подразумеваете промежуток времени «восемь с половиной часов», а не время суток «половина восьмого утра», тогда избегайте этого формата HH:MM:SS
. Этот формат неоднозначен, кажется, время суток. Вместо этого используйте стандартный формат ISO 8601, описанный ниже.
Продолжительность и время суток - два совершенно разных понятия. Вы должны быть ясны с ними, каждый должен быть ясным в вашем уме. Использование неоднозначного формата HH: MM: SS делает это различие еще более трудным (поэтому избегайте этого формата!).
java.time
Современный способ - классы java.time.
LocalTime
Сначала проанализируйте вашу строку как LocalTime
. Этот класс представляет время суток без даты и без часового пояса. Отсутствие часового пояса означает, что эти объекты основаны на общих 24-часовых часах без учета таких аномалий, как Летнее время (DST) .
Нам на самом деле не нужно LocalTime
, поскольку ваша входная строка представляет промежуток времени, а не время суток. Но это только первый шаг.
LocalTime lt = LocalTime.parse ( "08:30:00" );
Duration
Для представления желаемого промежутка времени нам нужен класс Duration
. Этот класс предназначен для промежутков времени, не привязанных к временной шкале. Мы можем создать его, преобразовав это LocalTime
, получив количество времени от начала часов времени, 00:00:00.0
или LocalTime.MIN
и lt
, который мы только что создали ,
Duration d = Duration.between ( LocalTime.MIN , lt );
Редактирование строки ввода
Подход, описанный выше с использованием LocalTime
, работает, только если ваши входные строки представляют продолжительность менее 24 часов. Если прошло более 24 часов, вы сами проанализируете входную строку.
Что-то вроде следующего кода. Конечно, фактический анализ зависит от разрешения неоднозначности вашей конкретной входной строки. 50:00
- это пятьдесят или пятьдесят минут? (Эта двусмысленность является веской причиной, чтобы по возможности избегать этого запутанного формата и придерживаться форматов ISO 8601.)
String input = "50:00"; // Or "50:00:00" (fifty hours, either way)
String[] parts = input.split ( ":" );
Duration d = Duration.ZERO;
if ( parts.length == 3 ) {
int hours = Integer.parseInt ( parts[ 0 ] );
int minutes = Integer.parseInt ( parts[ 1 ] );
int seconds = Integer.parseInt ( parts[ 2 ] );
d = d.plusHours ( hours ).plusMinutes ( minutes ).plusSeconds ( seconds );
} else if ( parts.length == 2 ) {
int hours = Integer.parseInt ( parts[ 0 ] );
int minutes = Integer.parseInt ( parts[ 1 ] );
d = d.plusHours ( hours ).plusMinutes ( minutes );
} else {
System.out.println ( "ERROR - Unexpected input." );
}
ISO 8601
Мы можем увидеть результат, сгенерировав строку в стандартном формате ISO 8601 для длительностей , просто вызвав Duration::toString
. Классы java.time по умолчанию используют ISO 8601 при разборе / генерации строк. Для длительностей стандартным форматом является PnYnMnDTnHnMnS
, где P
отмечает начало, а T
отделяет часть лет-месяцев-дней от части часов-минут-секунд. Итак, наши восемь с половиной часов будут выглядеть как PT8H30M
.
System.out.println ("d.toString ():" + d);
d.toString (): PT8H30M
Сбор Duration
объектов
Вы можете сделать List
удерживающие элементы типа Duration
.
List<Duration> durations = new ArrayList<>( 3 ); // Initial capacity of 3 elements.
durations.add( d ) ;
durations.add( Duration.between ( LocalTime.MIN , LocalTime.parse ( "03:00:00" ) ) ) ;
durations.add( Duration.between ( LocalTime.MIN , LocalTime.parse ( "01:15:00" ) ) ) ;
durations.toString (): [PT8H30M, PT3H, PT1H15M]
Помните, что строки, которые вы видите в этом выводе, такие как PT8H30M
, - это просто вывод сгенерированных строк. Тип Duration
- это не простая строка, а скорее генерирует объект String с помощью метода toString
.
Если вы придерживаетесь форматов ISO 8601, вы можете легко анализировать, а также генерировать такие строки. Нет необходимости проходить ригамароль конверсии LocalTime
, которую мы выполняли в верхней части этого ответа.
Duration d = Duration.parse( "PT8H30M" );
См. Этот пример код вживую в 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 .