Час нулевой площадки в DateFormat - PullRequest
2 голосов
/ 08 января 2012

Я пытаюсь отобразить разницу во времени в строку, которая имеет вид 00:00:00 (часы: минуты: секунды) с нулем. У меня есть следующий код:

long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
time = DateFormat.format("hh:mm:ss", timeDiff).toString(); 

Я тестировал его, когда timeDiff составлял не более нескольких секунд, но час не отображается как 00. Кстати, я нахожусь в часовом поясе JST.

Ответы [ 4 ]

2 голосов
/ 08 января 2012

Где вы взяли mStartRecordingTime?Мне не кажется, что он был установлен с System.currentTimeMillis () в той же локали;если бы это было так, то разница во времени отразила бы фактическую разницу, и это сработало бы.Похоже, что время записи каким-то образом было установлено с UTC, 9 часов от JST.

Другой плакат верен, дата, созданная с этим значением, будет близка к эпохе, но если вы просто пытаетесь получить часы, минуты и секунды, то с вами все будет в порядке.Имейте в виду, что вы имеете дело с прошедшим временем, а не с часами / календарем, поэтому я не ожидаю, что форматирование даты (в отличие от форматирования времени) сработает для вас.

2 голосов
/ 08 января 2012

Использование SimpleDateFormat:

long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
String time = new SimpleDateFormat("hh:mm:ss").format(new Date(timeDiff)); 
0 голосов
/ 18 сентября 2016

tl; др

Duration.between( 
    LocalTime.of( 12 , 5 , 0 ) ,
    LocalTime.of( 12 , 7 , 0 ) 
).toString()

PT2M

Если, вопреки моей настоятельной рекомендации использовать Duration, вы настаиваете на использовании двусмысленного / запутанного времениформатирование дня:

LocalTime.MIN.plus(
    Duration.between( 
        LocalTime.of( 12 , 5 , 0 ) ,
        LocalTime.of( 12 , 7 , 0 ) 
    )
).toString();

00: 02

Для принудительного применения всех трех компонентов (часы, минуты, секунды) используйте предопределенный DateTimeFormatter.ISO_LOCAL_TIME.

LocalTime.MIN.plus(
    Duration.between( 
        LocalTime.of( 12 , 5 , 0 ) ,
        LocalTime.of( 12 , 7 , 0 ) 
    )
).format( DateTimeFormatter.ISO_LOCAL_TIME )

00: 02: 00

См. живой код в IdeOne.com .

Момент! = Span-of-time

Не злоупотребляйте классом даты и времени, таким как java.util.Date, для хранения прошедшего времени.Такой класс представляет момент, а не промежуток времени.

Избегайте устаревших классов даты и времени

Не используйте проблемные старые классы даты и времени, такие как java.util.Date.Теперь они заменяются классами java.time.

Instant

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд .

Получить текущий момент.

Instant now = Instant.now();

Имитация на более позднее время.

Instant future = now.plus( Duration.ofMinutes( 5 ) );

Duration

Время, затраченное на захват объекта Duration или Period.Каждый из них представляет промежуток времени, первый обрабатывает дни-часы-минуты-секунды, а второй - годы-месяцы-дни.

Duration duration = Duration.between( now , future );

Формат строки

Для представления этой продолжительностизначение в виде строки, не используйте форматирование времени дня, поскольку это неоднозначно.Вместо этого используйте стандартный ISO 8601 формат для продолжительности .Этот формат, PnYnMnDTnHnMnS, отмечает начало с P.T в середине отделяет часть лет-месяцев-дней от части часов-минут-секунд.Например, два с половиной часа - это PT2H30M.Наш пример из пяти минут: PT5M.

String output = duration.toString();  // PT5M

LocalTime

Если у вас есть фактическое время суток и вы хотите отформатировать с нулями заполнения, используйтеформат по умолчанию LocalTime::toString.

LocalTime.now( ZoneId.of( "America/Montreal" ) ).toString();  // 02:03:04.789Z

Другой пример.Опять же, я не рекомендую злоупотреблять LocalTime таким образом.(Вместо этого используйте Duration в течение истекшего времени.)

LocalTime start = LocalTime.now( ZoneId.of( "America/Montreal" ) );
LocalTime stop = start.plusMinutes( 7 );
Duration d = Duration.between( start , stop );
LocalTime result = LocalTime.MIN.plus( d );  // I do *not* recommend abusing `LocalTime` this way. Use `Duration` instead for elapsed time.
DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_TIME ;
String output = result.format( f );
System.out.println( "output: " + output );

вывод: 00: 07: 00

См. живой код в 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
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 08 января 2012

Вам необходимо компенсировать часовой пояс. С тем, что у вас есть, вероятно, проще всего изменить форматер даты, чтобы использовать UTC в качестве часового пояса. Вот некоторый код, который должен помочь:

    long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
    DateFormat df = new SimpleDateFormat("HH:mm:ss");
    df.setTimeZone(TimeZone.getTimeZone("UTC"));
    String time = df.format(new Date(timeDiff));

Обратите внимание, что изменение на «ЧЧ» - это формат даты для отображения времени в 24-часовом формате.

...