Как преобразовать секунды в накопленные ччч:мм:сс?

Я хочу преобразовать прошедшее количество накопленных секунд в часы:минуты:секунды. Например

93599 секунд до:

25:59:59

Как я могу это сделать? (Примечание: 24 часа не должны переноситься на 0 часов)


person JohnyTex    schedule 14.07.2015    source источник
comment
Подумайте об операторах деления и остатка. (Или используйте java.time или Joda Time...)   -  person Jon Skeet    schedule 14.07.2015
comment
Переполнение стека @JohnyText заполнено похожими вопросами. Что побудило вас опубликовать вопрос и ответить на него самостоятельно в течение 2 минут после публикации вопроса?   -  person CKing    schedule 14.07.2015
comment
Поскольку я не мог найти хороший ответ на накопленное время, я написал решение и сфабриковал вопрос, чтобы другие (и я) могли извлечь выгоду из наличия накопителя форматирования времени. :-)   -  person JohnyTex    schedule 14.07.2015
comment
Но я также хотел знать, есть ли у кого-то супер-решение, которое не включает вычитание, модуль и прочее дерьмо...   -  person JohnyTex    schedule 14.07.2015
comment
@JohnyTex Итак, ваш ответ лучше, чем бесчисленное множество других ответов, уже опубликованных на тот же вопрос? Почему бы не опубликовать ответ на эти вопросы?   -  person CKing    schedule 14.07.2015
comment
Точного вопроса не нашел. Если вы можете передать его мне, я удалю свой вопрос и опубликую свое предложение там.   -  person JohnyTex    schedule 14.07.2015
comment
@JohnyTex Попробуйте это и это и это... и это заняло у меня 30 секунд, чтобы найти.   -  person CKing    schedule 14.07.2015
comment
Все они, кажется, возвращаются к 0 часам в 24 часа, не так ли?   -  person JohnyTex    schedule 14.07.2015
comment
Так накопить часы, понял.   -  person Sotirios Delimanolis    schedule 14.07.2015
comment
Также проверьте это: в день, час, минуту и ​​секунду, используя timeunit"> stackoverflow.com/questions/11357945/   -  person Rahul Prasad    schedule 14.07.2015


Ответы (4)


Здесь полезен оператор модуля %. Что-то вроде этого будет хорошо работать

public static void convertTime(int seconds) {
    int secs = seconds % 60;
    int mins = (seconds / 60) % 60;
    int hours = (seconds / 60) / 60;
    System.out.printf("%d:%d:%d", hours, mins, secs);
}
person The Beanstalk    schedule 14.07.2015
comment
Число хруст здесь приятнее. Я помещу это в свой формат. - person JohnyTex; 14.07.2015

В Java 8 для выражения количество времени. Вы можете использовать Duration#ofSeconds(long) для создания экземпляра из количества секунд.

Duration ellapsed = Duration.ofSeconds(93599);

Однако формат toString по умолчанию выглядит так:

PT25H59M59S

это не то, что вы хотите. Вы можете сами посчитать (с различными toMinutes, toHours и т. д.), чтобы преобразовать его в нужный формат. Пример приведен здесь.

person Sotirios Delimanolis    schedule 14.07.2015

часы = 93599 / 3600. Используйте целочисленную арифметику для принудительного усечения.

Затем вычтите часы * 3600 из 93599. Назовите это foo. Или вычислить 93599 % 3600.

минуты = foo / 60. Используйте целочисленную арифметику.

Вычесть минуты * 60 из foo. Позвони в тот бар. Или вычислить foo% 60.

бар - оставшиеся секунды.

person P45 Imminent    schedule 14.07.2015

Скопируйте и используйте этот класс:

public class AccumulatedTimeFormat extends Format {

@Override
public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
    Long totalSeconds;

    if(obj instanceof Byte) {
        totalSeconds=((Byte)obj).longValue();
    } else if(obj instanceof Short) {
        totalSeconds=((Short)obj).longValue();
    } else if(obj instanceof Integer) {
        totalSeconds=((Integer)obj).longValue();
    } else if(obj instanceof Long) {
        totalSeconds=((Long)obj);
    } else {
        throw new IllegalArgumentException("Cannot format given Object as an accumulated-time String!");
    }

    long ss = Math.abs(totalSeconds) % 60;
    long mm = (Math.abs(totalSeconds) / 60) % 60;
    long h = (Math.abs(totalSeconds) / 60) / 60;

    if(totalSeconds<0) {
        toAppendTo.append('-');
    }
    toAppendTo.append(String.format("%d:%02d:%02d", h, mm, ss));

    return toAppendTo;
}

@Override
public Object parseObject(String source, ParsePosition pos) {
    //TODO Implement if needed!
    return null;
}

}

Так:

System.out.println((new AccumulatedTimeFormat()).format(93599));

Что печатает:

25:59:59
person JohnyTex    schedule 14.07.2015
comment
Что ж, для начала это выглядит огромным излишеством... и без объяснений (важные три строки спрятаны посередине) это не сильно поможет будущим посетителям. - person Jon Skeet; 14.07.2015
comment
Я не согласен - вы просто копируете класс и делаете (new AccumulatedTimeFormat()).format(93599); - person JohnyTex; 14.07.2015
comment
Это не значит, что это не излишество... (Тот факт, что он поддерживает только часть того, чем должен быть Format, является хорошим признаком того, что это не очень хорошее решение... если вы только нужна часть форматирования, и она нужна только для int или long (что вероятно), тогда вы можете сделать это примерно в 5 строках.) - person Jon Skeet; 14.07.2015
comment
int h=(int)(Math.abs(totalSeconds)/3600); может переполниться для некоторых значений totalSeconds. Кроме того, двойное число может не преобразоваться в длинное. Я бы не доверял этому коду больше, чем мог бы плюнуть слону. - person P45 Imminent; 14.07.2015
comment
@ P45Imminent Разделить слона на Java довольно просто. "elephant".split("").. Но я с вами согласен. Этот код не лучше, чем расщепление слона на Java. - person CKing; 14.07.2015
comment
Спасибо за отзыв. Я поменял на длинный. - person JohnyTex; 14.07.2015
comment
Конечно, это может быть излишним, но в следующий раз, когда у меня возникнет эта проблема, я смогу решить ее, не задумываясь. Просто скопируйте класс и используйте формат. Вот почему мне это нравится. С другими вещами мне приходится объявлять переменные и много хлопот. Помогите мне получить его на 100% вместо этого. - person JohnyTex; 14.07.2015
comment
И ваш бедный возможный преемник вашей кодовой базы спросит, почему, почему они не использовали стандартную библиотечную функцию?. - person P45 Imminent; 14.07.2015
comment
Собственно, это я и спрашиваю! Есть ли стандартный (хороший) способ сделать это, тогда покажите мне, и я приму ваш ответ. Все ответы, которые я вижу, - это деление материала, модуля и т. Д. - person JohnyTex; 14.07.2015