Я хочу преобразовать прошедшее количество накопленных секунд в часы:минуты:секунды. Например
93599 секунд до:
25:59:59
Как я могу это сделать? (Примечание: 24 часа не должны переноситься на 0 часов)
Я хочу преобразовать прошедшее количество накопленных секунд в часы:минуты:секунды. Например
93599 секунд до:
25:59:59
Как я могу это сделать? (Примечание: 24 часа не должны переноситься на 0 часов)
Здесь полезен оператор модуля %
. Что-то вроде этого будет хорошо работать
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);
}
В Java 8 для выражения количество времени. Вы можете использовать Duration#ofSeconds(long)
для создания экземпляра из количества секунд.
Duration ellapsed = Duration.ofSeconds(93599);
Однако формат toString
по умолчанию выглядит так:
PT25H59M59S
это не то, что вы хотите. Вы можете сами посчитать (с различными toMinutes
, toHours
и т. д.), чтобы преобразовать его в нужный формат. Пример приведен здесь.
часы = 93599 / 3600. Используйте целочисленную арифметику для принудительного усечения.
Затем вычтите часы * 3600 из 93599. Назовите это foo. Или вычислить 93599 % 3600.
минуты = foo / 60. Используйте целочисленную арифметику.
Вычесть минуты * 60 из foo. Позвони в тот бар. Или вычислить foo% 60.
бар - оставшиеся секунды.
Скопируйте и используйте этот класс:
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
Format
, является хорошим признаком того, что это не очень хорошее решение... если вы только нужна часть форматирования, и она нужна только для int
или long
(что вероятно), тогда вы можете сделать это примерно в 5 строках.)
- person Jon Skeet; 14.07.2015
int h=(int)(Math.abs(totalSeconds)/3600);
может переполниться для некоторых значений totalSeconds
. Кроме того, двойное число может не преобразоваться в длинное. Я бы не доверял этому коду больше, чем мог бы плюнуть слону.
- person P45 Imminent; 14.07.2015
"elephant".split("")
.. Но я с вами согласен. Этот код не лучше, чем расщепление слона на Java.
- person CKing; 14.07.2015
java.time
или Joda Time...) - person Jon Skeet   schedule 14.07.2015