[Resolvido] Como garantir que datas como 31/2/2012 não sejam aceitas pela sua classe Data?

12 respostas
R

Estou tentando fazer o teste para que datas como 31/2 não sejam aceitas, mas não consigo fazer com que o método que valida a data seja testado dentro do método que formata a data.

class Data {
	int dia;
	int mes;
	int ano;
	
	public boolean dataValida(int d, int m, int a) {
		if (d > 31) return false;
		if (m > 12) return false;
		if ((m == 4 || m == 6 || m == 9 || m == 11) && (dia > 30)) {
			return false;
		}
		if (m == 2) {
			if (bissexto (a)) {
				if (d > 29) return false;
			} else {
				if (d > 28) return false;
			}
			
		} return true;
	}
	
	boolean bissexto (int a) {
		return (((a % 4 == 0) && (a % 100 != 0)) || (a % 400 == 0));
	}

	String formatada() {
		if(this.dataValida() == false) {
			return ("Data Inválida");
		} else {
			String d = this.dia + "/" + this.mes + "/" + this.ano;
			return d;
		}
	}
}

12 Respostas

L

E se vc adicionar o seguinte IF:

if ((m == 2 && d > 29) { // Se o dia for inválido para o mês de fevereiro
	return false;
}

EDIT
Ih, foi mal, agora que reparei que já tem essa verificação. Então não entendi o problema.

L

Se estiver trabalhando com tempo, de uma pesquisada sobre a classe LocalDateTime, que quebra um galho enorme. Com ela vc pode tbm pedir pra retornar um momento - de segundos a anos - específico. Relaxe, pra coisas assim nós programadores nao precisamos sofrer… vendo se tem alguma Biblioteca, Framework, etc, que faça as partes chatas/complicadas/desnecessárias/difíceis, a menos que queira reinventar a roda… :), então nesse caso veja se isso funciona: esse cálculo de bissexto, ou passando um parâmetro nesse this.dataValida ().

J

Como @Laio falou, use LocalDate que já vem tudo pronto, nao precisa perder tempo com isso. Exemplo pra ilustrar:

public boolean dataValida(String dataIso) {
        try {
            LocalDate.parse(dataIso); //pode passar por parametro outro formato caso queira
        } catch (DateTimeParseException e) {
            return false;
        }
        return true;
    }
if (!dataValida("2020-02-31")) {
...
}
R

Obrigado, vou testar!

R

Obrigado! Na realidade este é um exercício que estou fazendo da apostila do Caelum, ela pede que você não permita que dadas como 31/02 sejam aceitas, e precisa ser feito sem utilizar classes prontas! O erro que esta dando é nesta linha "if(this.dataValida() == false) ", pois como tive de criar a formatada() como String, ele não está aceitando o teste utilizando um boolean. Sou iniciante, desculpe não saber explicar bem.

T

Você está chamando um método que necessita de parâmetros.

R

Eu estou passando estes parâmetros por outra classe.

T

Qual outra classe?

R
public class BancoExe5_8 {

public static void main(String[] args) {

Conta c = new Conta(Rinaldo,2000);

c.setData (20, 03, 2020);
Conta c1 = new Conta("Alessandra",3500);
	c1.setData (30, 02, 2020);
	
	c.deposita(150);
	c1.deposita(300);
	
	System.out.println(c.dadosParaImpressao());
	System.out.println(c1.dadosParaImpressao());

}

}

class Data {

int dia;

int mes;

int ano;
public boolean dataValida(int d, int m, int a) {
	if (d > 31) return false;
	if (m > 12) return false;
	if ((m == 4 || m == 6 || m == 9 || m == 11) && (dia > 30)) {
		return false;
	}
	if (m == 2) {
		if (bissexto (a)) {
			if (d > 29) return false;
		} else {
			if (d > 28) return false;
		}
		
	} return true;
}



boolean bissexto (int a) {
	return (((a % 4 == 0) && (a % 100 != 0)) || (a % 400 == 0));
}


String formatada() {
	if(this.dataValida() == false) {
		return ("Data Inválida");
	} else {
		String d = this.dia + "/" + this.mes + "/" + this.ano;
		return d;
	}
}

}

T

Não é assim.
Veja. Você criou dois objetos c e c1 instanciando a Classe Conta.
Chamou o método setData passando parâmetros para os atributos da classe, mas não chamou o método dataValida repassando os valores que atribuiu.
O erro no this.dataValida() == false é justamente porque não tem o preenchimento dos argumentos no método.

R

Valeu Trapezus, funcionou agora! Obrigado!

R

Obrigado!

Criado 8 de julho de 2020
Ultima resposta 10 de jul. de 2020
Respostas 12
Participantes 5