Преобразовать значение секунд в часы, минуты, секунды? - PullRequest
87 голосов
/ 25 мая 2011

Я пытался преобразовать значение секунд (в переменной BigDecimal) в строку в editText, например, «1 час 22 минуты 33 секунды» или что-то в этом роде.

Я пробовал это:

String sequenceCaptureTime = "";
BigDecimal roundThreeCalc = new BigDecimal("0");
BigDecimal hours = new BigDecimal("0");
BigDecimal myremainder = new BigDecimal("0");
BigDecimal minutes = new BigDecimal("0");
BigDecimal seconds = new BigDecimal("0");
BigDecimal var3600 = new BigDecimal("3600");
BigDecimal var60 = new BigDecimal("60");

(у меня есть roundThreeCalc, значение в секундах, поэтому я пытаюсь преобразовать его здесь.)

hours = (roundThreeCalc.divide(var3600));
myremainder = (roundThreeCalc.remainder(var3600));
minutes = (myremainder.divide(var60));
seconds = (myremainder.remainder(var60));
sequenceCaptureTime =  hours.toString() + minutes.toString() + seconds.toString();

Затем я установил для editText значение sequnceCaptureTime String.Но это не сработало.Это заставило приложение закрыться каждый раз.Я совершенно не в себе, любая помощь очень ценится.Удачного кодирования!

Ответы [ 18 ]

204 голосов
/ 25 мая 2011

Нужно ли использовать BigDecimal?Если вам не нужно, я бы использовал int или long на несколько секунд, и это немного упростило бы вещи:

hours = totalSecs / 3600;
minutes = (totalSecs % 3600) / 60;
seconds = totalSecs % 60;

timeString = String.format("%02d:%02d:%02d", hours, minutes, seconds);

Возможно, вы захотите дополнить каждый, чтобы убедиться, что они дваЗначения цифр (или что-то еще) в строке, хотя.

63 голосов
/ 13 октября 2015

DateUtils.formatElapsedTime(long), форматирует прошедшее время в форме "MM:SS" или "H:MM:SS".Он возвращает строку, которую вы ищете.Вы можете найти документацию здесь

60 голосов
/ 25 мая 2011

У вас должно быть больше удачи с

hours = roundThreeCalc.divide(var3600, BigDecimal.ROUND_FLOOR);
myremainder = roundThreeCalc.remainder(var3600);
minutes = myremainder.divide(var60, BigDecimal.ROUND_FLOOR);
seconds = myremainder.remainder(var60);

Это будет отбрасывать десятичные значения после каждого деления.

Изменить: Если это не сработало, попробуйте это. (Я только написал и проверил)

public static int[] splitToComponentTimes(BigDecimal biggy)
{
    long longVal = biggy.longValue();
    int hours = (int) longVal / 3600;
    int remainder = (int) longVal - hours * 3600;
    int mins = remainder / 60;
    remainder = remainder - mins * 60;
    int secs = remainder;

    int[] ints = {hours , mins , secs};
    return ints;
}
26 голосов
/ 22 декабря 2012

Вот рабочий код:

private String getDurationString(int seconds) {

    int hours = seconds / 3600;
    int minutes = (seconds % 3600) / 60;
    seconds = seconds % 60;

    return twoDigitString(hours) + " : " + twoDigitString(minutes) + " : " + twoDigitString(seconds);
}

private String twoDigitString(int number) {

    if (number == 0) {
        return "00";
    }

    if (number / 10 == 0) {
        return "0" + number;
    }

    return String.valueOf(number);
}
24 голосов
/ 24 июня 2014

Что-то действительно полезное в Java 8

import java.time.LocalTime;

private String ConvertSecondToHHMMSSString(int nSecondTime) {
    return LocalTime.MIN.plusSeconds(nSecondTime).toString();
}
14 голосов
/ 13 марта 2017

Я предпочитаю встроенный Java TimeUnit библиотека

long seconds = TimeUnit.MINUTES.toSeconds(8);
11 голосов
/ 27 мая 2014
private String ConvertSecondToHHMMString(int secondtTime)
{
  TimeZone tz = TimeZone.getTimeZone("UTC");
  SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
  df.setTimeZone(tz);
  String time = df.format(new Date(secondtTime*1000L));

  return time;

}
8 голосов
/ 10 января 2017

Это мое простое решение:

String secToTime(int sec) {
    int seconds = sec % 60;
    int minutes = sec / 60;
    if (minutes >= 60) {
        int hours = minutes / 60;
        minutes %= 60;
        if( hours >= 24) {
            int days = hours / 24;
            return String.format("%d days %02d:%02d:%02d", days,hours%24, minutes, seconds);
        }
        return String.format("%02d:%02d:%02d", hours, minutes, seconds);
    }
    return String.format("00:%02d:%02d", minutes, seconds);
}

Test Results:

Result: 00:00:36 - 36
Result: 01:00:07 - 3607
Result: 6313 days 12:39:05 - 545488745
4 голосов
/ 02 ноября 2017

Мне нравится, чтобы все было проще:

    int tot_seconds = 5000;
    int hours = tot_seconds / 3600;
    int minutes = (tot_seconds % 3600) / 60;
    int seconds = tot_seconds % 60;

    String timeString = String.format("%02d Hour %02d Minutes %02d Seconds ", hours, minutes, seconds);

    System.out.println(timeString);

Результат будет: 01 час 23 минуты 20 секунд

3 голосов
/ 08 мая 2018

Этот код работает отлично:

txtTimer.setText(String.format("%02d:%02d:%02d",(SecondsCounter/3600), ((SecondsCounter % 3600)/60), (SecondsCounter % 60)));
...