Segundos em horas, minutos e segs

Boas, tive cerca de 3/4 aulas de programação até agora (estou a tirar engenharia informática) e estou a fazer um programa que converte Segundos em horas, minutos e segundos… Pelo que vi até agora, não encontrei nenhum sítio onde faziam como eu fiz (que tem erros pq se colocar 120 segundos fica 1 minuto e 60 segundos (sendo que é suposto ficar 2 minutos)).
Posso fazer assim ou o melhor é apagar mesmo?

package segHora;

public class OrganizedSeconds {

public static void main(String[] args) {

	int Seconds = 120 ;
	int Minutes = 0 ;                                  //Este programa converte um valor de segundos em minutos e horas
	int Hours = 0 ;

	if ( Seconds>=60 )  Minutes = Minutes+1 ;
	if ( Minutes > 0 )   Seconds = Seconds-60 ;
	if ( Minutes>=60) Hours = Hours+1 ;                //Quando insiro um número maior que 119 fica segs=60/61...
	if (Hours >0) Minutes=Minutes-60; 


	System.out.printf("O número de horas é %d, de minutos é %d e de segundos é %d",Hours, Minutes, Seconds) ;
}

}

Sou bastante novo a programar, não me julguem pelas noobagens :sweat_smile:

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.

1 curtida