Подтвердить что ты не робот

Как преобразовать секунды в этом формате "HH: mm: ss"

Я хочу преобразовать второй/миллисекунды в этом формате "HH: mm: ss" (для эсэмплов, от 5 секунд до 00:00:05). Я попытался получить этот формат следующим образом:

int millis = 5000;
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
String time = df.format(millis);

Таким образом, я получаю "01:00:05", а не "00:00:05". Где я ошибаюсь?

4b9b3361

Ответ 1

Часовые пояса.

Длительное значение 5000 означает 5 секунд после эпохи. Для большинства часовых поясов, через 5 секунд после эпохи не 5 секунд за полночь локального времени.

Обновление Java 8:

java.time.LocalTime будет обрабатывать идею настенных часов "время суток", без необходимости беспокоиться о часовых поясах и днях, неявных в java.util.Date. Если вы можете использовать Java 8, и ваши длительности всегда будут меньше одного дня, то правильная версия вашего примера может быть такой же простой, как:

int millis = 5000;
int seconds = millis / 1000; // Maybe no need to divide if the input is in seconds
LocalTime timeOfDay = LocalTime.ofSecondOfDay(seconds);
String time = timeOfDay.toString();

(я предполагаю, что строго говоря, java.time.Duration - лучшая модель того, что вы хотите, поскольку она представляет собой определенное количество секунд, а не время суток. Но это боль в формате hh: mm: ss, поэтому, если вы всегда имеете дело с значениями в 24 часа, TimeOfDay дает вам это форматирование бесплатно и в противном случае эквивалентно.)


Если вы застряли в Java 7 или ниже, то явное указание часового пояса GMT в вашем примере кода должно дать вам ожидаемый результат.

Здесь Scala REPL сеанс, демонстрирующий проблему, и решение Java 7 на моей машине:

scala> val millis = 5000
millis: Int = 5000

scala> val df = new java.text.SimpleDateFormat("HH:mm:ss")
df: java.text.SimpleDateFormat = [email protected]

scala> df.format(millis)
res0: java.lang.String = 01:00:05

scala> df.getTimeZone.getID
res1: java.lang.String = GB

scala> df.getTimeZone.getOffset(millis)
res2: Int = 3600000

scala> df.setTimeZone(java.util.TimeZone.getTimeZone("GMT"))

scala> df.format(millis)
res3: java.lang.String = 00:00:05

Итак, вы можете видеть, что мой часовой пояс по умолчанию - GB, который имеет смещение в 1 час от GMT в момент времени, обозначенный 5000L. Установка часового пояса для GMT gievs ожидаемого выхода 00:00:05.

Ответ 2

Я получил это, чтобы работать. Дайте мне знать, если это сработает для вас. Кажется, много строк, чтобы сделать что-то вроде просто.

    int millis = 5000;
    TimeZone tz = TimeZone.getTimeZone("UTC");
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
    df.setTimeZone(tz);
    String time = df.format(new Date(millis));
    System.out.println(time);

Ответ 3

Вы должны получить SimpleDateFormat с аргументом Locale.

public static String getDateFromMillis(long millis) {
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
    return formatter.format(new Date(millis));
}

Ответ 4

public class HHMMSS {

        final int UUR = 3600;
        final int MINUUT = 60;

    public void converteerTijd() {

        int uren, minuten, seconden, ingave;
        System.out.print("Geef een aantal seconden: ");
        ingave = Input.readInt();
        uren = ingave / UUR;
        minuten = (ingave - uren * UUR) / MINUUT;
        seconden = ingave - uren * UUR - minuten * MINUUT;
        String nU1 = (uren < 10) ? "0" : "";
        String nM1 = (minuten < 10) ? "0" : "";
        String nS1 = (seconden < 10) ? "0" : "";
        System.out.println(nU1 + uren + "-" + nM1 + minuten + "-" + nS1 + seconden);

Ответ 5

Ответ Java 9: ​​

    Duration dur = Duration.ofMillis(millis);
    System.out.println(String.format("%02d:%02d:%02d",
                       dur.toHours(), dur.toMinutesPart(), dur.toSecondsPart()));

(еще не проверено)

Методы toXxPart описаны в API-документах для Java 9.

Ответ 6

Я написал простую функцию утилиты для этой задачи, которая не требует какой-либо версии Java и не создает никаких ненужных объектов:

/**
 * provides a String representation of the given time
 * @return {@code millis} in hh:mm:ss format
 */
public static final String formatTime(long millis) {
    long secs = millis / 1000;
    return String.format("%02d:%02d:%02d", (secs % 86400) / 3600, (secs % 3600) / 60, secs % 60);
}

В отличие от некоторых других решений здесь, это может даже иметь дело до 100 часов