Как отформатировать прошедший временной интервал в формате hh: mm: ss.SSS в Java?

Я делаю секундомер, где использую Java SimpleDateFormat для преобразования количества миллисекунд в красивое "чч: мм: сс: SSS" формат. Проблема в том, что в поле часов всегда есть какое-то случайное число. Вот код, который я использую:

public static String formatTime(long millis) {
    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss.SSS");

    String strDate = sdf.format(millis);
    return strDate;
}

Если я сниму часть hh, все будет нормально. В противном случае в части hh будет отображаться что-то случайное, например «07», даже если переданный аргумент (количество миллисекунд) равен нулю.

Я мало что знаю о классе SimpleDateFormat. Спасибо за любую помощь.

36
задан JDS 15 July 2011 в 17:10
поделиться

1 ответ

tl; доктор

LocalTime                     // Represents a time-of-day, without date and without time zone.
.ofNanoOfDay(                 // Convert a count of nanoseconds into a time-of-day in a generic 24-hour day, ignoring real-world anomalies such as Daylight Saving Time (DST). 
    Duration                  // Class that represents a span-of-time not attached to the timeline.
    .of( milliseconds )       // Parse your count of milliseconds as a span-of-time.
    .toNanos()                // Extract total number of nanoseconds in this span-of-time.
)                             // Returns a `LocalDate` object.
.toString()                   // Generate text in standard ISO 8601 format for a time-of-day (*not* recommended by me). 

java.time.Duration

надлежащий класс для представления промежутка-разового, одинокого временной шкале с масштабом мелких секунд часов, Duration . Для масштаба дней месяцев лет используйте Period .

Duration d = Duration.of( milliseconds ) ;

формат

ISO 8601 я предлагаю, чтобы Вы постарались не сообщать о промежутке-разового с помощью формата времени суток HH:MM:SS. Я видел, что свойственная неоднозначность приводит к неверному истолкованию и беспорядку в реальных бизнес-приложениях.

существует стандарт для создания отчетов, что такие значения, определили в [1 119] ISO 8601 : PnYnMnDTnHnMnS. P метки начало, в то время как эти T разделяет любую часть дня месяца года от любой hour-minute-second части.

java.time классы используют стандартные форматы ISO 8601 по умолчанию при парсинге/генерации строк. Это включает Duration класс.

Duration d = Duration.ofMillis( 5_025_678L ) ;
String output = d.toString() ;

Посмотрите этот код, выполненный живой по IdeOne.com .

PT1H23M45.678S

Эти строки ISO 8601 могут быть проанализированы, а также сгенерированы.

Duration d = Duration.parse( "PT1H23M45.678S" ) ;

формат

Времени суток, Но если Вы настаиваете на формате времени суток использования на свое время, можно соединить такое жало путем вызова эти to…Part методы на [1 114] объект.

Duration d = Duration.ofMillis( 5_025_678L ) ;
String output = d.toHoursPart() + ":" + d.toMinutesPart() + ":" + d.toSecondsPart() + "." + TimeUnit.NANOSECONDS.toMillis( d.toNanosPart() ) ;

1:23:45.678

Или мы могли злоупотребить LocalTime класс для создания строки.

Duration d = Duration.ofMillis( 5_025_678L ) ;
long nanoOfDay = d.toNanos() ;
LocalTime localTimeBogus = LocalTime.ofNanoOfDay( nanoOfDay ) ;
String output = localTimeBogus.toString() ;

Снова, Вы видите этот код, выполненный живой по IdeOne.com .

1:23:45.678

1
ответ дан 27 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: