Validar datas - expressão regular

7 respostas
rodrigo.bossini

Pessoal, desenvolvi a seguinte classe para validar datas:

package br.com.m2g.common.util;

import java.util.regex.Pattern;


public class ValidaData {
	static{
		padraoDia = Pattern.compile("([1-9]|0[1-9])|[1-2][0-9]|3[0-1]");
		padraoMes = Pattern.compile("(0[1-9]|[1-9])|1[0-2]");
		padraoAno = Pattern.compile("\d{2}|\d{4}");
		padraoDataCompleta = Pattern.compile("(\d+-\d+-\d+|\d+/\d+/\d+)");
		padraoFevereiro = Pattern.compile("2|02");
		padraoDiaFevereiroAnoBissexto = Pattern.compile("(0[1-9]|[1-2][0-9])");
		padraoDiaFevereiro = Pattern.compile("(0[1-9]|[1-2][0-8])");
	}
	private static Pattern padraoDia;
	private static Pattern padraoMes;
	private static Pattern padraoAno;
	private static Pattern padraoDataCompleta;
	private static Pattern padraoFevereiro;
	private static Pattern padraoDiaFevereiroAnoBissexto;
	private static Pattern padraoDiaFevereiro;

	
	
	public boolean validaData (String data){
		//primeiro verifica se a data está na formatação esperadab
		if (! padraoDataCompleta.matcher(data).matches()){
			return false;
		}
		//se chegar aqui, quebra a data em partes
		String [] aux = data.split("-|/");
		String dia = aux [0];
		String mes = aux[1];
		String ano = aux[2];
		
		//começa validando o ano		
		if (this.validaAno(ano)){
			//trata ano bissexto
			if (this.isAnoBissexto(ano))
				if (this.isFevereiro(mes))
					return this.validaDiaFevereiroAnoBissexto(dia);
				
			//se chegar aqui já validou o ano, e já se sabe que o ano não é bissexto
			//verifica o mês
			if (this.isFevereiro(mes))
				//se for fevereiro, valida o dia
				return this.validaDiaFevereiro(dia);
			
			//se não for fevereiro, valida o dia e o mes
			if (this.validaDia(dia) && this.validaMes(mes))
				return true;
		}
		//pega quaisquer falhas nos if's acima e retorna false
		return false;
	}
	
	
	private boolean isAnoBissexto(String ano){
		int anoInt = Integer.parseInt (ano);
		boolean isAnoBissexto = ((anoInt % 4 == 0 && anoInt % 100 != 0) ||(anoInt % 400 == 0) );
		return isAnoBissexto;
	}
	private boolean isFevereiro (String mes){
		return padraoFevereiro.matcher(mes).matches();
	}
	private boolean validaAno (String ano){
		return padraoAno.matcher(ano).matches();
	}
	private boolean validaDiaFevereiroAnoBissexto (String dia){
		return padraoDiaFevereiroAnoBissexto.matcher(dia).matches();
	}
	private boolean validaDia (String dia){
		return padraoDia.matcher(dia).matches();
	}
	private boolean validaMes (String mes){
		return padraoMes.matcher(mes).matches();
	}
	private boolean validaDiaFevereiro(String dia){
		return padraoDiaFevereiro.matcher(dia).matches();
	}
	
	
}

Pelos meus testes, ela funciona corretamente. Porém achei o código muito complexo. Daria pra fazer de um jeito muuuuuito mais simples que isso, ou é por aí mesmo?

7 Respostas

T

Ora, ora, pois pois. Já ouviste falar de “setLenient (false)” no SimpleDateFormat?

B

Isso é pra uso de verdade?

Poderia usar o Joda Time ou a própria API do Java, sem falar q deve ter mil outras APIs de validação po aí.

rodrigo.bossini

Serve pra validar ano bissexto? Tem um exemplo aí?

M
public static boolean isValid(String date, String format) {         
	SimpleDateFormat dateFormat = new SimpleDateFormat(format);     
	dateFormat.setLenient(false);                                   
	try {                                                           
		dateFormat.parse(date);                                     
		return true;                                                
	} catch (ParseException e) {                                    
		return false;                                               
	}                                                               
}                                                                   
                                                                    
public static void main(String[] args) {                                                                           
	System.out.println(isValid("2010-02-30", "yyyy-MM-dd"));        
	System.out.println(isValid("28/02/10 18:44", "dd/MM/yy HH:mm"));
}
B

http://joda-time.sourceforge.net/

DateTime _22abr2000 = new DateTime(2000, 4, 22);
boolean ehBissexto = _22abr2000.year().isLeap();

System.out.println("O ano de " + _22abr2000 + " é bissexto? " + ehBissexto);
rodrigo.bossini

Realmente, tinha feito trabalho de português. Valeu pela experiência. Não duvido que a validação interna destes métodos da api funcione de modo similar. Enfim, pra que reinventar a roda. Valeu.

E

Não fique desmerecendo os portugueses, por favor. Aí está o PMLM que sempre ajuda a gente aqui no fórum, e não é nenhum “português de anedota”. Ou será que nós todos somos “brasileiros de anedotas”? (eles também contam piadas sobre a gente, e são bem cabeludas :frowning: )

Criado 19 de janeiro de 2010
Ultima resposta 20 de jan. de 2010
Respostas 7
Participantes 5