Dá pra resolver só com divisão (/
) e resto da divisão (%
):
int segundos = 120;
int horas = segundos / 3600;
segundos %= 3600;
int minutos = segundos / 60;
segundos %= 60;
System.out.print("Tempo total:");
if (horas > 0)
System.out.printf(" %d horas", horas);
if (minutos > 0)
System.out.printf(" %d minutos", minutos);
if (segundos > 0)
System.out.printf(" %d segundos", segundos);
Como uma hora tem 3600 segundos, se eu dividir os segundos por 3600, terei o total de horas. E como são números inteiros, a divisão já é arredondada pra baixo.
Depois eu pego o resto da divisão por 3600 para pegar os segundos excedentes: segundos %= 3600
, que é o mesmo que segundos = segundos % 3600
.
Depois basta aplicar o mesmo raciocínio para os minutos: divido por 60 para obter o total de minutos e o resto da divisão por 60 para pegar os segundos excedentes (no caso de 120, o resto é zero, então também funciona para esse caso).
Não precisa testar se os valores são maiores que 60 (ou 3600) nem nada disso. Se for menor, a divisão dará zero e aí você só precisa testar na hora de imprimir.
Por fim, recomendo que use as convenções de nomenclatura do Java, que diz que nomes de variáveis devem começar com letra minúscula.
E só para constar, a partir do Java 9 você pode usar métodos prontos:
Duration total = Duration.ofSeconds(7300);
int horas = total.toHoursPart();
int minutos = total.toMinutesPart();
int segundos = total.toSecondsPart();
A classe java.time.Duration
surgiu no Java 8, porém os métodos toXXXPart()
só apareceram no Java 9. Então no Java 8 você teria que fazer as contas manualmente e não haveria vantagem em usar Duration
para isso. Atenção: não confundir com os métodos toHours()
e toMinutes()
, que retornam o total “geral”, e não a parte “excedente”:
Duration total = Duration.ofSeconds(7300);
System.out.printf("%d %d %d\n", total.toHoursPart(), total.toMinutesPart(), total.toSecondsPart()); // 2 1 40
System.out.printf("%d %d %d\n", total.toHours(), total.toMinutes(), total.toSeconds()); // 2 121 7300
Este código imprime:
2 1 40
2 121 7300
Repare que toMinutes
retornou 121
, pois 7300 segundos equivalem a 121 minutos (arrendondado para baixo). Para obter o valor dos minutos devidamente “quebrado”, deve-se usar toMinutesPart
.