Código java Valida Data

7 respostas Resolvido
H

Oque faz a linha “int[] diasPorMes = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};” ela é necessária? não estou conseguindo entender a função dela.

public class Data {

private int dia; // 1-31 conforme o mês
private int mes; // 1-12
private int ano; // qualquer ano
// construtor: chama checkMes para confirmar o valor adequado para mes;
// chama checkDia para confirmar o valor adequado para dia

public Data(int day, int month, int year) {
    dia = checkDia(day); // valida dia
    mes = checkMes(month); // valida month
    ano = year; // poderia validar ano
}
// método utilitário para confirmar o valor adequado de dia com base em mes e ano

private int checkDia(int testaDia) {
    int[] diasPorMes = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    // veririca se dia está no intervalo para mes
    if (testaDia > 0 && testaDia <= diasPorMes[mes]) {
        return testaDia;
    } // verifica ano bissexto
    else if (mes == 2 && testaDia == 29 && (ano % 400 == 0 || (ano % 4 == 0 && ano % 100 != 0))) {
        return testaDia;
    }
    //System.out.printf( "Dia inválido (%d) configura para 1.", testaDia );
    return testaDia; // mantém o objeto em estado consistente
}
// método utilitário para confirmar o valor adequado do mes

public int checkMes(int testaMes) {
    if (testaMes > 0 && testaMes <= 12) // valida mes
    {
        return testaMes;
    } else {
        System.out.printf(
                "Mês inválido (%d) configure para 1.", testaMes);
        return 1; // mantém o objeto em estado consistente
    }
}

7 Respostas

staroski

Essa linha declara e inicializa um array de inteiros.

Neste if aqui você está utilizando ela, então deve ser necessária sim

// veririca se dia está no intervalo para mes
if (testaDia > 0 && testaDia <= diasPorMes[mes]) {
    return testaDia;
}
Jonathan_Medeiros

Isso é realmente necessário ?
Já ouviu falar no componente jDateChooser ?
Ele já possuí toda essa validação que você está fazendo na mão tudo pronto, basta por na view e tratar da maneira que for necessária.

pmlm

E se não for uma aplicação gráfica?
Além de que me parece que isto é trabalho de iniciante onde o objetivo é aprender a linguagem e não a usar as libs já existentes.

Jonathan_Medeiros

Cara eu dei apenas uma dica para o amigo @Hisaelguedes, se fosse esse o caso como você disse de não ser uma aplicação gráfica, acredito que ele citaria no tópico, na descrição do problema, como não a fez, indiquei tal componente, afinal, quanto mais o autor do tópico fomentar a dúvida, qual o problema, e recursos utilizados, facilita para que os demais possam colaborar para a resolução do problema.
Dê foco sempre aos autores dos tópicos, na intenção de ajudá-los sempre, e não as respostas dos demais usuários.

pmlm

Uma resposta errada pode ser pior que uma não resposta.
Imagina que, como me parece, ele é iniciado. Está a aprender a usar if e estruturar em métodos e tu sugeres um componente de um contexto específico e que ele não faz a mínima ideia de como aplicar ao caso dele, baralhando ainda mais em vez de ajudar.

Pronto, para não ser apenas uma resposta à resposta:

Esse array contém a declaração dos dias de cada mês, na posição relativa ao mês. Imagina que tinhas um monte de if dessa forma

if (mes == 1) {
     dias = 31;
}
if (mes == 2 ) {
    dias = 28;
}
if (mes == 3) {
    dias = 31;
}
.....

Com o array consegues aceder diretamente ao número de dias de um mês

dias = diasPorMes[mes];
H
if (testaDia > 0 && testaDia <= diasPorMes[mes]) {

return testaDia;

}

O problema é que a variável mês sempre é zero porque primeiro é checado o dia, do que adianta o array?
esse código eu peguei aqui no guj não sei se esta correto.
sempre é verificado se testeDia é maior que 0 e testaDia <= diasPorMes na posição 0.

pmlm
Solucao aceita

Tens toda a razão, tens de inverter a ordem no construtor:

public Data(int day, int month, int year) {
    ano = year;
    mes = checkMes(month); // valida month
    dia = checkDia(day); // valida dia'
}
Criado 10 de fevereiro de 2017
Ultima resposta 11 de fev. de 2017
Respostas 7
Participantes 4