2012-01-08 3 views
2

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

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

Я тестировал его, когда TimeDiff было не более чем на несколько секунд, но час не показывает, как 00. Я в часовом поясе JST, кстати.

+0

Фактическая проблема заключалась в том, что час будет отображаться как 09, а не 00. – pilcrowpipe

+0

Вместо того, чтобы показывать прошедшее время как время дня (неоднозначное и запутанное), используйте стандартную [продолжительность ISO 8601] (https: // en .wikipedia.org/wiki/ISO_8601 # Durations) формата 'PnYnMnDTnHnMnS', например' PT4S', в течение четырех секунд. –

ответ

2

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

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

+0

Я установил его из другого класса, используя: mRecorder.mStartRecordingTime = System.currentTimeMillis(); – pilcrowpipe

2

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

long timeDiff = System.currentTimeMillis() - mStartRecordingTime; 
String time = new SimpleDateFormat("hh:mm:ss").format(new Date(timeDiff)); 
+1

осторожно, timeDiff будет всего несколько секунд, поэтому новая Date (timeDiff) даст вам дату в 1970 году – Sean

0

Вы должны компенсировать часовой пояс. С тем, что у вас есть, возможно, проще всего изменить формат даты, чтобы использовать 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)); 

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

+0

Спасибо, это сработало хорошо. – pilcrowpipe

0

Т.Л., д-р

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

См live code in IdeOne.com.

Момент! = Пролет от времени

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

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

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

Instant

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

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

Instant now = Instant.now(); 

Имитировать позднее.

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

Duration

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

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

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

Чтобы представить, что значение длительности в виде строки, не использовать время- день форматирования, как неоднозначна. Вместо этого используйте стандарт ISO 8601 format for durations. Этот формат, 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

См live code in IdeOne.com.


О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые классы legacy, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, теперь в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: 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.