Как преобразовать секунды в этот формат "ЧЧ: мм: сс" - PullRequest
27 голосов
/ 09 февраля 2012

Я хочу преобразовать секунды / миллисекунды в этот формат "ЧЧ: мм: сс" (для примеров, от 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».Где я не прав?

Ответы [ 6 ]

20 голосов
/ 09 февраля 2012

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

Длинное значение 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 - лучшая модель того, что вы хотите, в том смысле, что она представляет собой определенное количество секунд, а не время суток. Но это боль форматировать в чч: мм: сс, так что если вы всегда имеете дело со значениями меньше 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 = java.text.SimpleDateFormat@8140d380

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 дает ожидаемый результат 00:00:05.

12 голосов
/ 09 февраля 2012

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

    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);
6 голосов
/ 16 декабря 2017

Я написал простую служебную функцию для этой задачи, которая не требует никакой версии 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 / 3600, (secs % 3600) / 60, secs % 60);
}

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

5 голосов
/ 13 января 2015

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

public static String getDateFromMillis(long millis) {
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
    return formatter.format(new Date(millis));
}
1 голос
/ 12 апреля 2017

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 .

1 голос
/ 13 января 2015
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...