Я делаю секундомер, где использую 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. Спасибо за любую помощь.
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