Alguém me ajuda - Classe Data[resolvido]

19 respostas
uallace

Preciso fazer o seguinte programa:

Escreva uma classe cuja instância (objeto) represente uma data(dia,mês,ano). Esta classe deverá dispor dos seguintes métodos:

VERIFICA- verifica se a data é válida- dia (1 a 31), mês (1 a 12), ano (1900 a 2010), retornando verdadeiro ou falso;

COMPARA - recebe como parâmetro um objeto representando uma outra data e retorna:

0 se as datas forem iguais;

1 se a data corrente for mais recente que a do parâmetro;

-1 se a data do parâmetro for menos recente que a corrente.

DIA ? retorna o dia da data;

MÊS ? retorna o mês da data;

MÊS_EXTENSO ? retorna o mês da data corrente por extenso;

ANO ? retorna o ano da data;

Já fiz o seguinte:

public class MetodosData {

       DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
       Date dataA = null;
       Date dataB = null;

       public int Compara(Date d){
           int result;
           if(d.getTime()>dataB.getTime()){
               result = 1;
           }
           else{
              if(d.getTime()<dataB.getTime()){
               result = -1;
           }
              else{
               result = 0;
              }
       }
        return result;
   }
}

tentei fazer os outros métodos e não consegui. Podem me auxiliar, por favor???O que eu já fiz está de acordo com o exercício proposto???Desde já agradeço a atenção de vocês.

19 Respostas

thiago.correa

Cara você tem que interpretar o texto direitinho, o teu professor disse que era para criar um objeto que representasse uma data (dia, mês e ano), então, esses serão os teus atributos, só aí tu mata a questão de criar os métodos que retornam cada campo da data!

M

É, acho que ele não quer que você trabalhe com a classe Date.

Boa sorte!

Giulliano

Uma classe que reprsenta uma data seria algo como

public class MinhaData{
   Integer dia;
   Integer mes;
   Integer ano;

//Construor da classe
public MinhaData(Integer dia, Integer mes, Integer ano){
    this.dia = dia;
    this.mes = mes;
    this.ano= ano;

   //faz as verificações para ver se as informações são coerentes
    if(this.ano > 2010 || this.ano << 1900){
        throw new IllegalArgumentException("O ano deve estar entre 1900 e 2010");
   }
}

//aqui vc põe outros métodos;
}
uallace

Obrigado ae…confudi as coisas…valeu pela ajuda…Bom, mas se eu quisesse terminar usando a classe date, poderiam me ajudar???

thiago.correa

Ao invés da Date, use a Calendar, ficaria mais fácil!

uallace

Veja o que eu fiz se estar certo:

public class Data {

       int dia;
       int mes;
       int ano;
       
public Data(int dia, int mes, int ano){
    this.dia=dia;
    this.mes=mes;
    this.ano=ano; 
}

public boolean Verifica(int dia, int mes, int ano){
  
boolean result = false;
    if((ano>=1900)&&(ano<=2010)){
        if((mes>=1)&&(mes<=12)){
            if((dia>=1)&&(dia<=31)){
                result = true;
            }
        }
    }
    return result;
}
public int Compara(int n_dia, int n_mes, int n_ano){
   
}
public int Dia(){
    return dia;
}

public int Mes(){
    return mes;
}

public String Mes_extenso(){
    String mens = null;  
    switch(mes){  
        case(1):mens = "Janeiro";  
                        break;  
        case(2):mens = "Fevereiro";  
                        break;  
        case(3):mens = "Março";  
                        break;  
        case(4):mens = "Abril";  
                        break;  
        case(5):mens = "Maio";  
                        break;  
        case(6):mens = "Junho";  
                        break;  
        case(7):mens = "Julho";  
                        break;  
        case(8):mens = "Agosto";  
                        break;  
        case(9):mens = "Setembro";  
                        break;  
        case(10):mens = "Outubro";  
                        break;  
        case(11):mens = "Novembro";  
                        break;  
        case(12):mens = "Dezembro";  
    }  
    return mens;  
}
public int Ano(){
    return ano;
}

}

Ah, se puderem me ajuda no método para comparar. Como faço?Valeu a todos!

uallace

Podem me auxiliar por favor???

thiago.correa

Cara, é só você fazer uns testes para ver se está certo!
Sobre o método de comparação é só você responder a pergunta, quando dois dias são iguais?! Não é quando ambos possuem o mesmo dia do mês, mês do ano e ano?! Então, como você implementaria essa comparação!

public int compare(Data data) { return 0; //???? }

Faz uma força aí!

thiago.correa

O teu método que pega o mês por extendo está errado

1- porque o swicth só aceida inteiros e caracteres
2- como ele vai saber o mês que você quer?!

public String porExtenso() {

    swicth(mesDoAno) {//onde mesDoAno é o teu atributo da tua classe data
    }
}
M
Veja se essa comparação serve:
public int Compara(Data d) {
	int resultado=0;
	long param, corrente;
   	
	Date dataParam = new Date(d.getAno(), d.getMes(), d.getDia());
   	Date dataCorrente = new Date(this.getAno(), this.getMes(), this.getDia());
   	
   	param = dataParam.getTime();
   	corrente = dataCorrente.getTime();
   	
   	if (corrente > param)
   		resultado = 1;
   	if (corrente == param)
   		resultado = 0;
   	if (corrente < param)
   		resultado = -1;
	
	return resultado;
}
Boa sorte!
thiago.correa
mspereira:
Veja se essa comparação serve:
public int Compara(Data d) {
	int resultado=0;
	long param, corrente;
   	
	Date dataParam = new Date(d.getAno(), d.getMes(), d.getDia());
   	Date dataCorrente = new Date(this.getAno(), this.getMes(), this.getDia());
   	
   	param = dataParam.getTime();
   	corrente = dataCorrente.getTime();
   	
   	if (corrente > param)
   		resultado = 1;
   	if (corrente == param)
   		resultado = 0;
   	if (corrente < param)
   		resultado = -1;
	
	return resultado;
}
Boa sorte!

Bom, primeiro que o construtor que você usou está Deprecated, ou seja, não deve ser mais usado, segundo, não precisar fazer toda essa volta para comparar dois objetos Date para tal, basta utilizar o método compareTo,

Date d1 = new Date();
Date d2 = new Date();
int result = d1.compareTo(d2);

mesmo que não quisesse utilizar o método Date, poderia ser feito da seguinte maneira

Date d1 = new Date();
Date d2 = new Date();
int result = d1.getTime() - d2.getTime();
E

Uallace-san, o seu teste de validade de datas está um pouco quebrado.

As seguintes datas devem ser inválidas:

31/02/2010
30/02/2010
29/02/2010
29/02/1900
31/04/2010

Entretanto,
29/02/2000
29/02/2004
são válidas.

Ou seja, você tem de achar aquele algoritmo que indica se um ano é bissexto e você também tem de saber o número de dias de cada mês (abril tem 30 dias).

uallace

Obrigado a todos…em relação ao que o thiago.correa disse, sei que recebe inteiros e aqui ta dando certo…não sei se entendi bem…mas ele retorna o mes certo. Não consegui entender onde estar errado…Valeu pela ajuda.

uallace

To fazendo esta classe de verificação mas não da certo. Alguém pode me dizer pq?

public boolean Verifica(int dia, int mes, int ano){
    boolean result=true;
    if((ano>=1900)&&(ano<=2010)){
        if((mes==1)||(mes==3)||(mes==5)||
                (mes==7)||(mes==8)||(mes==10)||(mes==12)){
            if(dia==31){
                result = true;
            }
            else{
                result = false;
            }
        }
        else{
           if((mes==4)||(mes==6)||(mes==9)||(mes==11)){
               if(dia==30){
                   result = true;
               }
           }
           else{
               if(mes==2){
                   if(ano%4==0 && ano%100!=0 || ano%400==0){
                       if(dia==29){
                           result = true;
                       }
                       else{
                           result = false;
                       }
                   }
                   else{
                       if(dia==28){
                           result = true;
                       }
                       else{
                           result = false;
                       }
                   }
               }
               else{
                   result = false;
               }
           }
        }
    }
    else{
        result = false;
    }
    return result;
}
pmlm

uallace:
To fazendo esta classe de verificação mas não da certo. Alguém pode me dizer pq?

... if(dia==31){ ... if(dia==30){ ... if(dia==29){ ... if(dia==28){ ...

Não será <= ?

Giulliano

Código cheio de ifs é ruim de interpretar e dá margem ao erro. Veja se assim fica melhor:

List<Integer> mesesCom30Dias = new ArrayList<Integer>();
	List<Integer> mesesCom31Dias = new ArrayList<Integer>();
	
	public void Verifica(int dia, int mes, int ano){  
		populaMeses();
		
		if(ano >= 1900 && ano <= 2010){ 
			validarMesCom31Dias(dia, mes);
			validarMesCom30Dias(dia, mes);  
			validarAnoBissexto(dia, mes, ano);
		}
	}

	private void populaMeses() {
		mesesCom30Dias.add(4);
		mesesCom30Dias.add(6);
		mesesCom30Dias.add(9);
		mesesCom30Dias.add(11);
		
		mesesCom31Dias.add(1);
		mesesCom31Dias.add(3);
		mesesCom31Dias.add(5);
		mesesCom31Dias.add(7);
		mesesCom31Dias.add(8);
		mesesCom31Dias.add(10);
		mesesCom31Dias.add(12);
	}

	private void validarAnoBissexto(int dia, int mes, int ano) {
		if(mes==2){
			if( ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0){
				if(dia < 1 && dia > 29){
					throw new IllegalArgumentException("Data inválida");
				}
			}else{
				if(dia < 1 && dia > 28){
					throw new IllegalArgumentException("Data inválida");
				} 
			}
		}
	}

	private void validarMesCom30Dias(int dia, int mes) {
		if( mesesCom30Dias.contains(mes)){  
			if(dia < 1 && dia > 30){
				throw new IllegalArgumentException("Data inválida");
			}
		}
	}

	private void validarMesCom31Dias(int dia, int mes) {
		if(mesesCom31Dias.contains(mes)){  
			if(dia < 1 && dia > 31){
				throw new IllegalArgumentException("Data inválida");
			}  
		}
	}
M

thiago.correa:
Bom, primeiro que o construtor que você usou está Deprecated, ou seja, não deve ser mais usado, segundo, não precisar fazer toda essa volta para comparar dois objetos Date para tal, basta utilizar o método compareTo,
SET POGMODE ON :?

Boa sorte!

uallace

Veleu…td certo agora!

uallace

valeu!!!

Criado 8 de abril de 2010
Ultima resposta 9 de abr. de 2010
Respostas 19
Participantes 6