Duvidas, instanciar método e horário AM/PM !

21 respostas
programaçãojava
M

O que consegui fazer até agora foi isso, não consigo instanciar o método getHora1, e não faço a minima ideia de como colocar o horário em AM/PM, lembrando que AM/PM seria formato 12 horas.

package hora;
import java.util.Scanner;

public class Hora

{

Scanner ler = new Scanner(<a href="http://System.in">System.in</a>);

private int hora = 0;

private int min = 0;

private int seg = 0;
public Hora()
{		

do {
System.out.println("Digite a hora: ");
hora = ler.nextInt(); 
} while (hora > 24 || hora < 1);
do {	
System.out.println("Digite os minutos: ");
min = ler.nextInt();
} while (min > 60 || min < 0);
do {
System.out.println("Digite os segundos: ");
seg = ler.nextInt();
} while (seg > 60 || seg < 0);


}

public Hora(int h, int m, int s)
{
	this.hora = h;
	this.min = m;
	this.seg = s;		
	
}
public void setHor(int h)
{
	this.hora = h;

}
public void setMin(int m)
{
	this.min = m;
}
public void setSeg(int s)
{
	this.seg = s;
}
public void setHor()
{	
	do {
	System.out.println("Digite a hora: ");
	hora = ler.nextInt(); 
	} while (hora > 24 || hora < 1);

}
public void setMin()
{
	do {	
	System.out.println("Digite os minutos: ");
	min = ler.nextInt();
	} while (min > 60 || min < 0);

}
public void setSeg()
{
	do {
	System.out.println("Digite os segundos: ");
	seg = ler.nextInt();
	} while (seg > 60 || seg < 0);

}

public int getHor(int hora)
{
	return hora;
}

public int getMin(int min)
{
	return min;
}

public int getSeg(int seg)
{
	return seg;
}

public String getHora1 ()
{
	String formatado;
	formatado = (this.hora+":"+this.min+":"+this.seg);
	return formatado;
}

public void getHora2()
{


}

public void getSegundos()
{
	int calcH = hora * 3600;
	int calcM = min * 60;		
	int horario = seg + calcH + calcM;
	System.out.println("Qt segundos: "+horario);
	
}

public static void main(String[] args) { 	

Hora Exibir = new Hora ();		
System.out.println(Exibir);	
	

}

}

Eu preciso fazer isso:

 O construtor Hora() deve permitir ao usuário digitar os valores de hora, minuto e

segundos e com eles inicializar os atributos da classe. Os valores digitados deverão ser

consistidos e  aceitos se válidos, caso contrário, exigir ao usuário redigitar;

 O construtor Hora(int h, int m, int s) deverá receber os valores de hora, minuto e

segundos e com eles inicializa as propriedades da classe;

 Os métodos setHor(int h), setMin(int h) e setSeg(int h) devem receber um valor e

atribuí-lo ao respectivo atributo;

 Os métodos setHor(), setMin() e setSeg() devem permitir que o usuário digite um

valor e atribuí-lo ao respectivo atributo. Os valores digitados deverão ser consistidos e

 aceitos se válidos, caso contrário, exigir ao usuário redigitar;

 Os métodos getHor(), getMin() e getSeg() devem devolver as respectivas

propriedades;

 O método getHora1() deve nos devolver a hora no formato: hh:mm:ss;

 O método getHora2() deve nos devolver a hora no formato: hh:mm:ss (AM/PM);

 O método getSegundos() deve nos devolver a quantidade de segundos expressa na

hora em questão, (exemplo: 01:00:01 = 3601 segundos) .

 Conveniente colocar tratamento de exceção para as possíveis inconsistências na

entrada de dados.

21 Respostas

D

Quantas horas tem o nosso formato de hora? E quantas horas tem o formato americano, que usa os indicadores AM e PM? Quais horas estão no AM e quais estão no PM?

Outra coisa, você instancia objetos, nunca métodos. Métodos são invocados. Para isso, você precisa chamar a partir de uma instância de objeto:

Hora hora = new Hora(); //Antes do = você declara e depois, no new, você instancia
hora.getHora1(); // aqui você invoca o método getHora1();
M

então o certo seria eu chamar o objeto de Hora ? no exercício pede que o método tenha um retorno e que quando o usuário digite a hora/minuto/segundo, mostre naquela formatação, depois em AMP/PM e a Qtd de segundos daquela hora.

D

Veja, se dentro do main você fizer isso:

public static void main(String[] args) {
     getHora1();
}

O código ficará sublinhado em vermelho, acusando a tentativa de acessar um método não estático em um contexto estático. O mesmo ocorre com variáveis.
Agora, você já tem o objeto da classe Hora

public static void main(String[] args) { 	
    Hora Exibir = new Hora ();

Logo, já tem o primeiro passo para tudo. Ah, antes de mais nada, você precisa se atentar as convenções de nomes do java, classes com letras maiúsculas e variáveis e métodos com minúsculas, sempre seguindo o camelCase. No caso, o nome correto para o objeto seria “exibir” e não “Exibir”. Aliás, o nome mais adequado seria “hora”.

public static void main(String[] args) { 	
    Hora hora = new Hora ();
    hora.getHora1();

Entendeu? A ideia é usar objetos, então use o objeto.

M

Para deixar no formato HH:MM:SS, ainda não esta completo !

public String getHora1(String A)

{

A = (this.hora+":"+this.min+":"+this.seg);

return A;

}

Eu não estou conseguindo chamar o retorno do método getHora1.

public static void main(String[] args) {

Hora hora = new Hora ();
    hora.getHora1();
    
    System.out.println(hora.getHora1);        
    System.out.println(hora);


}
D

Veja, você nunca vai conseguir fazer isso:

Simplesmente por que você precisa indicar que está chamando o método, então, deve adicionar os parênteses

System.out.println(hora.getHora1());

Ou, você faz isso

String horaFormatada1 = hora.getHora1();
System.out.println(horaFormatada1);
M

Certo.

O usuário entra com os valores aqui :

public Hora()
{

do {
System.out.println("Digite a hora: ");
hora = ler.nextInt(); 
} while (hora > 24 || hora < 1);
do {	
System.out.println("Digite os minutos: ");
min = ler.nextInt();
} while (min > 60 || min < 0);
do {
System.out.println("Digite os segundos: ");
seg = ler.nextInt();
} while (seg > 60 || seg < 0);


}

Eu faço a formatação no método getHora1(), alterando o formato da hora para HH:MM:SS, lembrando que eu tenho a obrigação no exercício de retornar uma String.

public String getHora1(String A)

{

A = (this.hora+":"+this.min+":"+this.seg);

return A;

}

Agora, no Main, eu queria exibir a hora já formatada que o usuário digitou.

public static void main(String[] args) {

Hora hora = new Hora ();
            
    System.out.println(hora.getHora1);          
    System.out.println(hora);

   }
D

Releia meu comentário anterior, com atenção, e reproduza o que sugeri lá.

M

Desculpa, eu já tinha feito, apresentou um erro e esqueci de colocar.

public String getHora1(String A)

{

A = (this.hora+":"+this.min+":"+this.seg);

return A;

}

public static void main(String[] args) {

Hora hora = new Hora ();               
    String horaFormatada1 = hora.getHora1();
    System.out.println(horaFormatada1);         
    System.out.println(hora);

Agora ele apresenta esse erro:

method getHora1 in class Hora cannot be applied to given types;
required: String
found: no arguments
reason: actual and formal argument lists differ in length

Pelo que eu entendi, eu não passei nenhum parâmetro para o método que estou chamando, é isso ?

D

Acontece que, ou você mudou o método getHora1 e agora ele espera um parâmetro do tipo String ou o método que você colocou na postagem original é diferente do que você tem.

M

na postagem acima eu coloquei o método getHora1, modificado já !

M

KKKKKKKK, cara, não sei nem como me desculpar, só fui entender agora, obrigadão mesmo, me salvou, deu certo essa bagaça.
Sucesso cara.

M

import java.util.Scanner;

public class Hora

{

Scanner ler = new Scanner(<a href="http://System.in">System.in</a>);

private int hora;

private int min;

private int seg;
public Hora()
{
    setHor();
    setMin();
    setSeg();
}

public Hora(int h, int m, int s)
{
    this.hora = h;
    this.min = m;
    this.seg = s;

}
public void setHor(int h)
{
    this.hora = h; 
}
public void setMin(int m)
{
    this.min = m;  
}
public void setSeg(int s)
{
    this.seg = s;  
}
public void setHor()
{
    do {
        System.out.println("Digite a hora: ");
        hora = ler.nextInt();
    } while (hora > 24 || hora < 0);

}
public void setMin()
{
    do {
        System.out.println("Digite os minutos: ");
        min = ler.nextInt();
    } while (min > 60 || min < 0);

}
public void setSeg()
{
    do {
        System.out.println("Digite os segundos: ");
        seg = ler.nextInt();
    } while (seg > 60 || seg < 0);

}

public int getHor()
{
    return hora;
}

public int getMin()
{
    return min;
}

public int getSeg()
{
    return seg;
}

public String getHora1()
{
    String A = (this.hora+":"+this.min+":"+this.seg);
    return A;
}

AQUI É ONDE COMEÇA A TRETA, ONDE BUGUEI
Se o 1º IF, for verdadeiro, ele não ira executar mais nada ?
Ele esta executando apenas o 1º IF, quando o número é menor que 10, apenas “hora” fica no formato HH

public String getHora2()

{

if (hora < 12)

{
else if (hora < 10)
        {
            
            if (min < 10)
            {                    
            
                if(seg < 10)
                {
                    return "0"+hora+":0"+min+":0"+seg+" AM";
                }                    
                
                return "0"+hora+":0"+min+":"+seg+" AM";                   
            }
            return "0"+hora+":"+min+":"+seg+" AM";
        }
    return hora+":"+min+":"+seg+" AM";   
        
    }


    if (hora >= 12)
    {

        if (hora < 10)
        {
            
            if (min < 10)
            {                    
            
                if(seg < 10)
                {
                    return "0"+hora+":0"+min+":0"+seg+" PM";
                }                    
                
                return "0"+hora+":0"+min+":"+seg+" PM";                   
            }
            return "0"+hora+":"+min+":"+seg+" PM";
        }
    return hora+":"+min+":"+seg+" PM";   
        
    }
    

    else
    {
        return "Horário Inválido !";
    }




}

public int getSegundos()
{
    int calcH = hora * 3600;
    int calcM = min * 60;
    int horario = seg + calcH + calcM;
    return horario;

}

public static void main(String[] args)
{
    Hora hora = new Hora ();
    hora.getHora1();
    hora.getSegundos();
    hora.getHora2();
    System.out.println("Horário AM/PM: "+hora.getHora2());
    System.out.println("Horário: "+hora.getHora1());
    System.out.println("Quantidade de segundos: "+hora.getSegundos());

}

}

D

Não, fera. Não precisa dessa montoeira de ifs…

Vamos supor que você tenha as horas: 08:24:16 e 22:15:1234:
A primeira, como a hora é menor que 12, você devolve tudo, seguido de AM.
Na segunda, você só precisa tirar 12 das horas e devolver o resultado concatenado aos minutos e segundos e PM.
Ou seja, só valie as horas!

if(hora < 12) {
    return formataPadrao(hora) + ":" + formataPadrao(min) + ":" + formataPadrao(seg) + "AM";
} else {
    return formataPadrao(hora - 12) + ":" + formataPadrao(min) + ":" + formataPadrao(seg) + "PM";
}

E o formataPadrao

public String formataPadrao(int num) {
    return num < 10 ? "0" + num : "" + num;
}
M

Então Darlan, por ser um exercício acadêmico, não posso criar outro método, todos os métodos já foram determinados, e outra, existe a possibilidade do cliente colocar “8h:8m:8s” ai só colocaria um zero na frente da hora, mas não colocaria na frente dos minutos nem dos segundos!

D

Ok, substitua todas as chamadas ao método sugerido pelo conteúdo do método sugerido
Ao invés disso:

return formataPadrao(hora) + ":" + formataPadrao(min) + ":" + formataPadrao(seg) + "AM";

Use isso

return (hora < 10 ? "0" + hora : hora) + ":" + (min < 10 ? "0" + min : min) + ":" + (seg < 10 ? "0" + seg : seg) + "AM";

Ficou claro?

M

Ficou sim, porém agora surgiu outro problema:
Eu fiz dessa forma, ficou exato o horário, o problema é que como eu faço “hora - 12”, ele acaba voltando ao primeiro IF, sendo assim, ele sempre é AM. Na verdade, estou extremamente bugado nisso, pq mesmo que eu coloque apenas um if e um else, ele sempre mostra AM, sinceramente, não estou entendendo mais nada, pq num primeiro momento o IF é falso, pois foi digitado 23hrs, ai ele executa o “else if”, formata o horário certinho tirando as 12 horas das 23 que foi digitada, porém mesmo assim sai como AM.

String getHora2()
{

if (hora < 12)
    {
        return (hora < 10 ? "0" + hora : hora) + ":" + (min < 10 ? "0" + min : min) + ":" + (seg < 10 ? "0" + seg : seg) + " AM"; 
    } 
    
    else if (hora >= 12) 
    {
        
        return (hora < 10 ? "0" + (hora = hora - 12) : (hora = hora - 12)) + ":" + (min < 10 ? "0" + min : min) + ":" + (seg < 10 ? "0" + seg : seg) + " PM";
    }
    
    else
    {
        return "Horário Inválido";
    }
M

Bom dia, finalmente deu certo Darlan, obrigadão, fiz da seguinte forma

public String getHora2()
        {       
            String hr;
            String min;
            String seg;
            String periodo;
            int hr2;
            
            if(this.hora > 12)
            {
                hr2 = this.hora - 12;
            }
            else 
            {
                hr2 = this.hora;
            }
            if(hr2 < 10)
            {
                hr = "0"+hr2;
            }
            else
            {
                hr = ""+hr2;
            }
            
            if(this.min < 10)
                {
                    min = "0"+this.min;
                }
            else
                {
                    min = ""+this.min;
                }
            if(this.seg < 10)
                {
                    seg = "0"+this.seg;
                }
            else 
                {
                    seg = ""+this.seg;
                }
            if(this.hora < 12)
                {                    
                    periodo = "AM";
                }
            else
                {
                    
                    periodo = "PM";
                }
        
        return hr+":"+min+":"+seg+"("+periodo+")";
    }
D

Eu tenho um quê de agonia quando vejo código java com as chaves desta maneira…hahahaha.

M

hahahahahahha não é uma boa prática ?

D

É que este modelo de posicionar as chaves está mais para C# do que para java.
Java utiliza as chaves na mesma linha

public void blablabla {
    if(x > y) {

    } else {

    }
}

Desta maneira

M

Obrigado pela dica e pela ajuda Darlan, valeu mesmo !

Criado 23 de maio de 2018
Ultima resposta 30 de mai. de 2018
Respostas 21
Participantes 2