Duvida sobre datas

8 respostas
G

Oi pessoal.
Tenho uma classe chamada Data

private int dia;
	private int mes;
	private int ano;
	
	public int getDia() {
		return dia;
	}
	public void setDia(int dia) {
		this.dia = dia;
	}
	public int getMes() {
		return mes;
	}
	public void setMes(int mes) {
				
		this.mes = mes;
	}
	public int getAno() {
		return ano;
	}
	public void setAno(int ano) {
		this.ano = ano;
	}

O exercico propoe que eu impeça que datas como 31/2/2005 no formato data-mes-ano sejam instanciados.
Eu até pensei em algo como se fosse entre 1 e 10 ele acrecentaria um 0 como substring na casa do mes, mas nao resolveria
Se eu insiro 02 em um int , ele vai entender como 2.
Alguem tem alguma idéia de como poderia proceder aqui ?

Vlw

8 Respostas

nel

Oi!

Já pensou na possibilidade de usar o objeto java.util.Date e Calendar para fazer isso?
Podes usar uma String com a data deseja no formato dd/MM/yyyy e criar um Calendar a partir dessa data.

Podes zerar as horas, minutos e segundos em dois calendar e depois usar o equals() para comparar se ambos são iguais.
Conseguiu entender a idéia?

Abraços.

pmlm

Parece-me que o pretendido não será a diferença entre 2 e 02 no mês, mas sim o não permitires que uma data inválida como 31 de Fevereiro possa ser criada.

nel:
Já pensou na possibilidade de usar o objeto java.util.Date e Calendar para fazer isso?
Podes usar uma String com a data deseja no formato dd/MM/yyyy e criar um Calendar a partir dessa data.

Podes zerar as horas, minutos e segundos em dois calendar e depois usar o equals() para comparar se ambos são iguais.
Conseguiu entender a idéia?

Isto é exercicio de principiante para fazer ele mesmo, não para usar a API…

JoaoBluSCBR

Meio truncado esse teu enunciado.

Tá, teu problema pede que não sejam aceitas datas em formato incorreto, mas…

Tua classe tem valores int para receber os valores.

Obviamente a tua classe não tem nada a ver com o formato ddmmaaaa, ela só manipula números inteiros.

Ela nem ao menos trata o string que for apresentada. Não faz nenhum sentido. Ou tua classe foi mal construída
ou teu enunciado não está certo.

Você diz que se uma data estiver fora de formato ela não deve ser INSTANCIADA. Se você não vai nem instanciar,
essa análise não pode estar dentro da classe, pois é óbvio que em qualquer método que você fizer isso, mesmo
no construtor, a instanciação já aconteceu. Então tem que tratar fora. Em outra classe onde essa é usada.

Nessa outra classe faria algo como:

String data = "20/5/2005";

if((data.charAt(2) == '/') && (data.charAt(5)--'/'))
         instanciar;
else
         reclamar data em formato incorreto;
nel

Faz sentido.

JoaoBluSCBR

E complementando, se vc quer que isso aconteça dentro da tua classe,

crie um construtor que receba a String,

verifique se o caracter 2 e o 5 são barras, se forem

pegue os substrings de 0 a 2, de 3 a 5 e de 5 em diante.

Transforme cada um deles em inteiro.

Analise se o primeiro está entre 1 e 31,

O segundo entre 1 e 12

O terceiro, se está acima de, sei lá, de 1800.

Depois veja se o mês for 4, 6, 9, ou 11, o dia não pode ser 31.

E se o mes for 2 o dia não pode ser maior que 28 em ano não bissexto e 29 em ano bissexto.

E se em algum momento algo der errado, coloque null no this e encerre.

É claro que terá, fora, que verificar se a instanciação foi concluída com êxito ou null.

G

JoaoBluSCBR:
E complementando, se vc quer que isso aconteça dentro da tua classe,

crie um construtor que receba a String,

verifique se o caracter 2 e o 5 são barras, se forem

pegue os substrings de 0 a 2, de 3 a 5 e de 5 em diante.

Transforme cada um deles em inteiro.

Analise se o primeiro está entre 1 e 31,

O segundo entre 1 e 12

O terceiro, se está acima de, sei lá, de 1800.

Depois veja se o mês for 4, 6, 9, ou 11, o dia não pode ser 31.

E se o mes for 2 o dia não pode ser maior que 28 em ano não bissexto e 29 em ano bissexto.

E se em algum momento algo der errado, coloque null no this e encerre.

É claro que terá, fora, que verificar se a instanciação foi concluída com êxito ou null.

Eu vou tentar as sugestões assim que chegar em casa.
Em relação ao exercicio, ele se trata da primeira apostila de OO da Caelum que estou tentando resolver sozinho.

O enunciado é :

  1. (opcional) Como garantir que datas como 31/2/2005 não sejam aceitas pela sua classe Data?

Obrigado.

JoaoBluSCBR

Bem, então se o negócio é esse então tua classe serve, mas aí a questão não fala em instanciar.

Então é simplesmente fazer um comparativo para ver se a data é válida.

E se não for, o sistema tem de pedir outra. Então:

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

public boolean bisessto( int ano) 
{  
    return (((ano % 4 == 0) && (ano % 100 != 0)) || (ano % 400 == 0 ));  
}
G
JoaoBluSCBR:
Eu vou tentar as sugestões assim que chegar em casa. Em relação ao exercicio, ele se trata da primeira apostila de OO da Caelum que estou tentando resolver sozinho.

O enunciado é :

(opcional) Como garantir que datas como 31/2/2005 não sejam aceitas pela sua classe Data?

Bem, então se o negócio é esse então tua classe serve, mas aí a questão não fala em instanciar.

Então é simplesmente fazer um comparativo para ver se a data é válida.

E se não for, o sistema tem de pedir outra. Então:

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

public boolean bisessto( int ano) 
{  
    return (((ano % 4 == 0) && (ano % 100 != 0)) || (ano % 400 == 0 ));  
}

Nossa ! Tem razão.. foi falta de atenção no enunciado.
O enunciado não pediu que eu colocasse dois digitos e sim evitasse que tivesse datas como 31 de fevereiro..

Criado 1 de agosto de 2011
Ultima resposta 1 de ago. de 2011
Respostas 8
Participantes 4