Por que meu metodo para conferir data só entra na Exceção ?!

31 respostas
G

Meninos,

Copiei e adaptei um metodo aqui no Guj para conferir a data, acontece que ele entre sempre na Exceção !!

A data que estou passando é : 01/08/1980

O que estou errando ?? :oops: :oops:

public boolean confereData(Date data){
		boolean dataCerta=true;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
		sdf.setLenient(false);
		try {
			Date dl = sdf.parse(data.toString());			
		} catch (ParseException e) {
			dataCerta=false;
		} catch (java.text.ParseException e) {
			dataCerta=false;
		}
		return dataCerta;
		
	}

Lembrando que Date é do tipo java.util.date

Brigadinha

Giuliana :(

31 Respostas

T

Use “dd/MM/yyyy”, não “dd/mm/yyyy” (mm = minuto, MM = mês).

G

A sim, obrigada pela presteza

Eu coloquei o MM mas continua entrando na Exceção :cry: :cry:

Uma outra ideia ?

fiaux

Para que serve sdf.setLenient(false);?

Foxlol

Pelo que eu li na documentação: http://java.sun.com/javase/6/docs/api/java/text/DateFormat.html#setLenient(boolean)

Parece que se for setado pra false vc deve passar exatamente o formato exigido senão gera exceção.

somma

Ve se te ajuda:

/** * * @author asomma * 29/05/2008 */
public class Formatacao {

    public static Date strToDate(String data) throws ParseException {

        if (data == null || data.equals("")) {
            return null;
        }
        
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");   
        java.sql.Date date = new java.sql.Date(format.parse(data).getTime()); 
        
        return date;
    }
}
Foxlol
Giuliana:
Meninos,

Copiei e adaptei um metodo aqui no Guj para conferir a data, acontece que ele entre sempre na Exceção !!

A data que estou passando é : 01/08/1980

O que estou errando ?? :oops: :oops:

public boolean confereData(Date data){
		boolean dataCerta=true;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
		sdf.setLenient(false);
		try {
			Date dl = sdf.parse(data.toString());			
		} catch (ParseException e) {
			dataCerta=false;
		} catch (java.text.ParseException e) {
			dataCerta=false;
		}
		return dataCerta;
		
	}

Lembrando que Date é do tipo java.util.date

Brigadinha

Giuliana :(

Vc não deve fazer:

Date dl = sdf.parse(data.toString());

Pois o retorno do toString() da data passada não será do tipo do formato que vc setou:

SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");

Talvez com sem o lenient sendo falso funcione.
Senão vc deve passar uma data exatamente com o formato "dd/MM/yyyy".

Flw

fiaux

Pelo que eu li na documentação: http://java.sun.com/javase/6/docs/api/java/text/DateFormat.html#setLenient(boolean)

Parece que se for setado pra false vc deve passar exatamente o formato exigido senão gera exceção.

Pois é, eu desconfiei dele, nunca tinha visto.

G

Olha meninos, eu peguei este código aqui no GUJ e adaptei de acordo com o que tenho aqui, mas …

eu coloquei TRUE ao inves de FALSE foi para a exceção
retirei o setLenient e foi para a exceção

Agora como o oxlol disse eu acho que não estou sabendo fazer o Parse.

Porém não sei como fazer pois eu pego a data diretamente do Bean e ela vem em forma de Java.Util.Date !!! :oops: :oops: :oops:

Tô meio que perdida nisso ! :cry: :cry:

Algum de vocês sabe como proceder ?

Giuliana

Foxlol

Então…mas se vc jah recebe uma data, pq vc esta transformando ela em String para depois transforma-la em Date novamente?? :shock:

A formatação vc utiliza apenas para exibição.

Por exemplo:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String = sdf.format(data);

Isso vai retornar sua data formatada…mas como String.

O tipo Date não possui um formato em si.

[]'s

G

A sim

Retirei o .toString mas ele me mostra o erro :

The method parse(String) in the type DateFormat is not applicable for the arguments (Date)

:cry: :cry:

Foxlol

Giuliana:
A sim

Retirei o .toString mas ele me mostra o erro :

The method parse(String) in the type DateFormat is not applicable for the arguments (Date)

:cry: :cry:

Vc eskeceu de mudar de parse para format.

Mas que tipo de validação que vc quer fazer???

G

A sim

ué, se é data valida ou não !

29/02/2007 invalido

29/02/2008 valido

31/04/2008 invalido

.
.
.
.

ivo_costa

Não entendi muito bem oq vc deseja mais eu acho que são duas coisas:

Vc que verificar se uma data é válida:
O java não permite criar um objeto Date inválido, ou seja não a necessidade de verificar se um objeto do tipo Date passa no parse.

Vc que verificar se uma data é válida pra uma determinada regra de negócio, por exemplo: o ano ser menor ou igual ao atual:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Teste {

	public Teste(){
		try{
			System.out.println(confereData( new Date() ));
		}
		catch(Exception e){e.printStackTrace();}
		
	}
	
	public boolean confereData(Date data) throws Exception{
		SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
		try {
			//Métodos deprecated USAR CALENDAR AO INVÉS DE DATE
			int dia = data.getDay();
			int mes = data.getMonth();
			int ano = data.getYear();
			
			//Essa data é igual a primeira!!!!!
			Date data2 = sdf.parse(dia + "/" + mes + "/" + ano);
			
			if(ano > 2008) throw new Exception("Data inválida");
			
		} catch (ParseException e) {
			return false;
		}
		return true;
	}
	
	public boolean confereDataCalendar(Date data) throws Exception{
		Calendar cal = Calendar.getInstance();
		cal.setTime(data);
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
		try {
			//Agora sim!!! Calendar
			int dia = cal.get(Calendar.DAY_OF_MONTH);
			int mes = cal.get(Calendar.MONTH);
			int ano = cal.get(Calendar.YEAR);
			
			//Essa data é igual a primeira e igual ao calendar!!!!!
			Date data2 = sdf.parse(dia + "/" + mes + "/" + ano);
			
			if(ano > 2008) throw new Exception("Data inválida");
		} catch (ParseException e) {
			return false;
		}
		return true;
	}
	
	public static void main(String[] args) {
		new Teste();
	}
}
G

Ou seja, testar mes a mes

Testar ano

Testar fevereiro

Testar dias > 31

se for assim na munheca é facil

Agora método pequeno que verifica se data é invalida ! Isso não tem ?

Giuliana :shock:

Foxlol

Giuliana:
A sim

ué, se é data valida ou não !

29/02/2007 invalido

29/02/2008 valido

31/04/2008 invalido

.
.
.
.

Como o Ivo Costa disse não é possível criar um Date inválido. E caso vc queira tratar alguma coisa em especialfaça como ele mencionou acima.

Flw

ivo_costa

Vou tentar denovo:

NÃO é possível criar um objeto do tipo DATE inválido. Ou seja NÃO há necessídade de verificar se um objeto DATE é inválido.

O que poderia acontecer é vc querer verificar se uma STRING e NÃO um objeto DATE é uma data válida, então seria assim:

public boolean testaData(String possivelData){
		SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyyy");
		
		try{
			s.parse(possivelData);
		}
		catch(Exception e){
			return false;
		}
		
		return true;
	}
G

Sim Ivo

Eu fiz assim :

public boolean confereData(Date data){
		boolean dataCerta=true;
		Calendar cal = Calendar.getInstance();
		cal.setTime(data);
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		try {
			int dia = cal.get(Calendar.DAY_OF_MONTH);
			int mes = cal.get(Calendar.MONTH);
			int ano = cal.get(Calendar.YEAR);
			Date data1 = sdf.parse(dia + "/" + mes + "/" + ano );
		} catch (ParseException e) {
			dataCerta=false;
		} catch (java.text.ParseException e) {
			dataCerta=false;
		}
		return dataCerta;
		
	}

Mas acho que tô ficando doida ou esse Java tá danado mas ...

Se eu passar a data : 31/04/2008

Debugando ele me mostra no dia o Numero 1 no mes o 4 e no ano o 2008

Se eu passar 29/02/2007 ele me mostra no dia 1 no mes 2 no ano 2007

Por que ele tá em mostrando no
int dia = cal.get(Calendar.DAY_OF_MONTH);
somente 1 ?????????

Ta danado gente !

Desculpe a ingronorança

Giuliana

Foxlol

Giuliana, como vc esta criando ou pegando este Date que vc recebe como parametro no metodo confereData?

Este teu tratamento esta totalmente desnecessario.

G

Ahhh ? desnecessario ?

Ué, o processo é :

O Usuario digita la no Form 31/04/2008

No meu servlet eu passo :

if (!util.confereData(cliente.getDtNascCli())){ consistencia=false; }else

ele tem que me retornar um boolean

ivo_costa

O que o objeto cliente?
Como vc está populando objeto Cliente?
Como vc está pegando a data do form e colocando no atributo dtNascCli no objeto cliente?

Talvez o problema esteja antes da validação da data tenta o seguinte:

System.out.Pintln(cliente.getDtNascCli());
System.out.Pintln(cliente.getDtNascCli().toString());
if (!util.confereData(cliente.getDtNascCli())){
	consistencia=false;
}else
Foxlol

Giuliana:
Ahhh ? desnecessario ?

Ué, o processo é :

O Usuario digita la no Form 31/04/2008

No meu servlet eu passo :

if (!util.confereData(cliente.getDtNascCli())){ consistencia=false; }else

ele tem que me retornar um boolean

Faz assim:

public boolean confereData(Date data){
		boolean dataCerta=true;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		sdf.setLenient(false);
		try {
			Date dl = sdf.parse(sdf.format(data));			
		} catch (ParseException e) {
			dataCerta=false;
		} catch (java.text.ParseException e) {
			dataCerta=false;
		}
		return dataCerta;
		
	}
G

Faço assim lá no Servlet :

cliente.setDtNascCli(sdf.parse(request.getParameter("dtNascCli")));

Sendo sdf :

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

Será que estou fazendo errado ?

Giuliana :cry:

Foxlol

Giuliana:
Faço assim lá no Servlet :

cliente.setDtNascCli(sdf.parse(request.getParameter("dtNascCli")));

Sendo sdf :

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

Será que estou fazendo errado ?

Giuliana :cry:

Altere seu metodo confereData e deixe-o assim:

public boolean confereData(Date data){
		boolean dataCerta=true;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		sdf.setLenient(false);
		try {
			Date dl = sdf.parse(sdf.format(data));			
		} catch (ParseException e) {
			dataCerta=false;
		} catch (java.text.ParseException e) {
			dataCerta=false;
		}
		return dataCerta;
		
	}
G

Foxlol, fiz mas não vai na exception de forma alguma, com data errada ou não :frowning: :frowning: :frowning: :frowning:

Foxlol

Eu fiz um teste aqui e deu Exception:

import java.text.*;
import java.util.*;

class Teste {

	public static void main(String args[]) {
		String dataCerta = "";
		
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			sdf.setLenient(false);
			
			Date data = sdf.parse("31/02/2008");

			dataCerta = sdf.format(data);			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println("Data certa: " + dataCerta);
	}

}

Pode ser que a data ja esteja vindo corrigida pra um outro valor pra vc do Form, mesmo vc informando um valor invalido.

Tente fazer isso e veja o que vai aparecer na saida padrão:

public boolean confereData(Date data){
		boolean dataCerta=true;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		sdf.setLenient(false);
		try {
			Date dl = sdf.parse(sdf.format(data));			
		} catch (ParseException e) {
			dataCerta=false;
		} catch (java.text.ParseException e) {
			dataCerta=false;
		}

                System.out.println("DATA: " + sdf.format(data));               
 
		return dataCerta;
		
	}
G

Fiz do jeito que me falou :

Passei a data : 32/08/1980

Ele nao deu Exception e lá no console (println) escreveu : 01/09/1980

Socorro !!!

Giuliana

WashingtonBotelho

Eu fiz um código aqui pra validar a data.
Vê se te ajuda ai amigo.
Giu, não é muito difícil. ;D

public String validaData(String dataDia, String dataMes, String dataAno) {
    dia = Integer.parseInt(dataDia);
    mes = Integer.parseInt(dataMes);
    ano = Integer.parseInt(dataAno);

    if (dia < 1 || dia > 31 || // Dia menor que 1 e maior que 31
            mes == 2 && ((ano - 1900) % 4) != 0 && dia > 28 || // Fevereiro e não bissesto.
            mes <= 6 && (mes % 2) == 0 && dia > 30 || // Meses 30
            mes > 6 && ((mes - 7) % 2) != 0 && dia > 30) { // Meses 31
      return "O Dia de Nascimento é inválido!";
    } else if (mes < 1 || mes > 12) {
      return "O Mês de Nascimento é inválido!";
    } else if (ano < 1 || ano > calendar.get(GregorianCalendar.YEAR)) {
      return "O Ano de Nascimento é inválido!";
    }
    return null;
  }

Obs.: calendar é um objeto GregorianCalendar.

Abraço..

Foxlol

Giuliana:
Fiz do jeito que me falou :

Passei a data : 32/08/1980

Ele nao deu Exception e lá no console (println) escreveu : 01/09/1980

Socorro !!!

Giuliana

Então…eh isso mesmo que eu te disse…ele da corrigindo a data pra vc.
Vc passou a data errada 32/08/1980…e ele corrigiu para 01/09/1980.

Ou seja, qualquer data que chegar no metodo confereData estara correta e nunca lancará exceção.

Vc tem que fazer teu servlet receber uma String em vez de Date, e vc mesmo validar.

Ou fazer de algum outro modo que no momento num me vem a cabeça :cry:

G

Entendi menino!

Muito obrigada mesmo pela força

Vou continuar tentando aqui

Giuliana :slight_smile:

G

Meninos, fiz o que vocês me falaram :

Ao inves de enviar um Date para o confereData, enviei diretamente o request.getparameter(“minhaData”) para lá como String.

Ae consegui resolver o problema, ele agora lança a Exception.

Porém, não achei uma Melhor Solução e gostaria que alguem pudesse me explicar o por quê que passando um atributo tipo Date ele “Concerta” com “C” mesmo tipo se passar 31/04/2008 ele aparece lá no método 01/05/2008 !!!

Muito obrigada

Foxlol, washington e todos que tentaram me ajudar

Giuliana :wink: :wink: :wink:

W

ue porque ele corrige a data pra vc, ele sabe que não existe dia 31 no mes de abril, logo ele pula pra proxima data valida que seria, 01/05

Criado 29 de maio de 2008
Ultima resposta 30 de mai. de 2008
Respostas 31
Participantes 8