Вопрос-ответ

How to convert Milliseconds to "X mins, x seconds" in Java?

Как преобразовать миллисекунды в "X минут, x секунд" в Java?

Я хочу записать время, используя System.currentTimeMillis() когда пользователь начинает что-то в моей программе. Когда он закончит, я вычту текущее значение System.currentTimeMillis() из start переменной, и я хочу показать им прошедшее время, используя удобочитаемый формат, такой как "XX часов, XX минут, XX секунд" или даже "XX минут, XX секунд", потому что это вряд ли займет у кого-то час.

Какой лучший способ сделать это?

Переведено автоматически
Ответ 1

Используйте класс java.util.concurrent.TimeUnit:

String.format("%d min, %d sec", 
TimeUnit.MILLISECONDS.toMinutes(millis),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

Примечание: TimeUnit является частью спецификации Java 1.5, но toMinutes был добавлен в Java 1.6.

Чтобы добавить начальный ноль для значений 0-9, просто выполните:

String.format("%02d min, %02d sec", 
TimeUnit.MILLISECONDS.toMinutes(millis),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

Если TimeUnit или toMinutes не поддерживаются (например, в Android до версии API 9), используйте следующие уравнения:

int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours = (int) ((milliseconds / (1000*60*60)) % 24);
//etc...
Ответ 2

На основе ответа @siddhadev я написал функцию, которая преобразует миллисекунды в форматированную строку:

   /**
* Convert a millisecond duration to a string format
*
* @param millis A duration to convert to a string form
* @return A string of the form "X Days Y Hours Z Minutes A Seconds".
*/

public static String getDurationBreakdown(long millis) {
if(millis < 0) {
throw new IllegalArgumentException("Duration must be greater than zero!");
}

long days = TimeUnit.MILLISECONDS.toDays(millis);
millis -= TimeUnit.DAYS.toMillis(days);
long hours = TimeUnit.MILLISECONDS.toHours(millis);
millis -= TimeUnit.HOURS.toMillis(hours);
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
millis -= TimeUnit.MINUTES.toMillis(minutes);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);

StringBuilder sb = new StringBuilder(64);
sb.append(days);
sb.append(" Days ");
sb.append(hours);
sb.append(" Hours ");
sb.append(minutes);
sb.append(" Minutes ");
sb.append(seconds);
sb.append(" Seconds");

return(sb.toString());
}
Ответ 3
long time = 1536259;

return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));

С принтами:


25:36:259


Ответ 4

Использование пакета java.time в Java 8:

Instant start = Instant.now();
Thread.sleep(63553);
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

Выходные данные представлены в формате длительности ISO 8601: PT1M3.553S (1 минута и 3,553 секунды).

java