Verifica se a data esta correta de acordo com o calendário

Eu queria validar para saber se o usuário digitou correto o mês e o dia. Por exemplo: se o usuário digitar dia 32/01/2003 ou 30/02/2003, queria mandar uma mensagem avisando e parar o processamento; se o usuário digitar também 31/13/2003, queria mandar uma mensagem avisando e parar o processamento.
Sei que tem que usar a classe GregorianCalendar. No botão para processar criei o seguinte:

Só que agora eu não estou conseguindo fazer o restante, alguém poderia me ajudar ?

Estou no aguardo e desde já obrigado,

Frank…

p/ tratar datas aki no nosso sistema, utilizei um componente especial…chamado JDateTextField…

procure ele na net, pois ele jah faz todo esse tratamento…

falow

Rafael,
Será que você poderia quebrar o meu galho e me dizer aonde eu encontro este componente ?
Meu projeto esta atrasado …
Mas mesmo assim eu estou indo atrás.

Obrigado por tudo,

ai vai o codigo do componente…
o site eu nao lembro mais…fazmto tempo q peguei…


import java.awt.Component;
import java.awt.event.*;
import java.io.PrintStream;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.*;
import javax.swing.text.JTextComponent;


/**
* JTextField personalizado permitindo somente datas.
*/
public class JDateTextField extends JTextField 
{


	/**
	* Seta o padrão de data utilizada no campo.
	*
	* @param i		Um inteiro contendo o padrão de data.
	*/
	public void setDefaultType(int i) 
	{
		if (i == BLANKS) 
		{
			nDefaultType = BLANKS;
			super.setText("  /  /    ");
		} 
		else
			if (i == UNDERSCORES) 
			{
				nDefaultType = UNDERSCORES;
				super.setText("  /  /    ");
			} 
			else
				if (i == YEAR) 
				{
					nDefaultType = YEAR;
					super.setText("0000");
				} 
	}


	/**
	* Retorna o padrão de data utilizada no campo.
	*
	* @return	Um inteiro contendo o padrão de data.
	*/
	public int getDefaultType() 
	{
		return nDefaultType;
	}


	/**
	* Seta a data passada no campo.
	*
	* @param date	Uma data que será mostrada no campo.
	*/
	public void setDate(Date date) 
	{
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		super.setText(createDateString(calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.MONTH)+1, calendar.get(Calendar.YEAR)));
	}


	/**
	* Seta a data passada no campo.
	*
	* @param date	Uma data que será mostrada no campo.
	*/
	public void setText(Date date) 
	{
		setDate(date);
	}


	/**
	* Seta a data passada (como String) no campo.
	*
	* @param s		Uma String contendo a data que será mostrada no campo.
	*/
	public void setText(String s) 
	{
		Date date = null;
		if (s != null) 
		{
			ParsePosition parseposition = new ParsePosition(0);
			if (nDefaultType == YEAR) 
			{
				SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy");
				date = simpledateformat.parse(s, parseposition);
			} 
			else 
			{
				SimpleDateFormat simpledateformat1 = new SimpleDateFormat("dd/MM/yyyy");
				date = simpledateformat1.parse(s, parseposition);
			}
		}
		if (date == null) 
		{
			Calendar calendar = Calendar.getInstance();
			date = calendar.getTime();
		}
		setDate(date);
	}


	/**
	* Retorna a data do campo como uma String.
	*
	* @return	Uma String contendo a data do campo.
	*/
	public String getDateText() 
	{
		Date dDate = getDate();
		if (dDate == null)
			return "";


		Calendar calendar = Calendar.getInstance();
		calendar.setTime(getDate());
		return createDateString(calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.MONTH)+1, calendar.get(Calendar.YEAR));
	}


	/**
	* Retorna a data do campo como uma String.
	*
	* @return	Uma String contendo a data do campo.
	*/
	public String toString() 
	{
		return getText();
	}


	/**
	* Verifica se o campo está vazio.
	*
	* @return	Um boolean true se verdadeiro ou false, caso contrário.
	*/
	public boolean isEmptyDate() 
	{
		String sCurrentText = super.getText();


		if (sCurrentText.compareTo("  /  /    ") == 0)
			return true;
		if (sCurrentText.compareTo("  /  /    ") == 0)
			return true;


		return false;
	}


	/**
	* Retorna a data do campo.
	*
	* @return	Um Date contendo a data do campo.
	*/
	public Date getDate() throws NumberFormatException 
	{
		Calendar calendar = Calendar.getInstance();
		String sTmp = "";
		int nYear = 2002;
		int nMonth = 1;
		int nDay = 1;
		int ai[] = { 1, 3, 5, 7, 8, 10, 12 };


		String sCurrentText = super.getText();


		Vector vector = new Vector(7);
		for(int l = 0; l < ai.length; l++)
			vector.addElement(new Integer(ai[l]));


		calendar.set(nYear, nMonth, nDay, 0, 0, 0);
		try 
		{
		   sTmp = replaceString(sCurrentText.substring(0, 2).trim(), "_", "");
		   nDay = Integer.parseInt(sTmp);
		   sTmp = replaceString(sCurrentText.substring(3, 5).trim(), "_", "");
		   nMonth = Integer.parseInt(sTmp);
		   sTmp = replaceString(sCurrentText.substring(6).trim(), "_", "");


		   // Suporta 1 , 01, 001, 2001
		   if (sTmp.length() == 1)
			   sTmp = "200" + sTmp;
		   if (sTmp.length() == 2)
			   sTmp = "20" + sTmp;
		   if (sTmp.length() == 3)
				sTmp = "2" + sTmp;
		   nYear = Integer.parseInt(sTmp);


		} catch(IndexOutOfBoundsException indexoutofboundsexception) 
		  {
			 setCaretPosition(0);
			 NumberFormatException numberformatexception2 = new NumberFormatException(new String("A Data " + sCurrentText + " é inválida - DD/MM/YYYY"));
			 throw numberformatexception2;
		  } catch(NumberFormatException numberformatexception) 
			{
				setCaretPosition(0);
			}
	   calendar.set(nYear, nMonth - 1, nDay, 0, 0, 0);
	   return calendar.getTime();
	}


	/**
	* Retorna a data e hora do campo.
	*
	* @return	Um Calendar contendo a data e hora do campo.
	*/
	public Calendar getDateTime() throws NumberFormatException 
	{
		Calendar calendar = Calendar.getInstance();
		String sTmp = "";
		int nYear = 2002;
		int nMonth = 1;
		int nDay = 1;
		int ai[] = { 1, 3, 5, 7, 8, 10, 12 };


		String sCurrentText = super.getText();


		Vector vector = new Vector(7);
		for(int l = 0; l < ai.length; l++)
			vector.addElement(new Integer(ai[l]));


		calendar.set(nYear, nMonth, nDay);
		try 
		{
		   sTmp = replaceString(sCurrentText.substring(0, 2).trim(), "_", "");
		   nDay = Integer.parseInt(sTmp);
		   sTmp = replaceString(sCurrentText.substring(3, 5).trim(), "_", "");
		   nMonth = Integer.parseInt(sTmp);
		   sTmp = replaceString(sCurrentText.substring(6).trim(), "_", "");


		   // Suporta 1 , 01, 001, 2001
		   if (sTmp.length() == 1)
			   sTmp = "200" + sTmp;
		   if (sTmp.length() == 2)
			   sTmp = "20" + sTmp;
		   if (sTmp.length() == 3)
				sTmp = "2" + sTmp;
		   nYear = Integer.parseInt(sTmp);


		} catch(IndexOutOfBoundsException indexoutofboundsexception) 
		  {
			 setCaretPosition(0);
			 NumberFormatException numberformatexception2 = new NumberFormatException(new String("A Data " + sCurrentText + " é inválida - DD/MM/YYYY"));
			 throw numberformatexception2;
		  } catch(NumberFormatException numberformatexception) 
			{
				setCaretPosition(0);
			}
	   calendar.set(nYear, nMonth - 1, nDay);
	   return calendar;
	}


	/**
	* Processa os eventos de teclados ocorridos no campo.
	*
	* @param keyevent	Um KeyEvent contendo o evento ocorrido no campo.
	*/
	public void processKeyEvent(KeyEvent keyevent) 
	{
		String s = "";
		String s2 = "";
		char c = keyevent.getKeyChar();
		boolean flag = false;
		boolean flag1 = false;
		boolean flag2 = false;
		boolean flag3 = false;
		boolean flag4 = false;
		byte byte0 = 1;
		boolean flag5 = false;
		boolean flag6 = false;
		boolean flag7 = false;
		boolean flag8 = false;
		boolean flag9 = false;
		flag5 = c == '';
		flag6 = c == '177';
		flag7 = c == '26';
		flag8 = c == '30';
		flag9 = keyevent.paramString().startsWith("KEY_PRESSED");
		if (keyevent.getKeyCode() == 0 || flag5 || flag6 || flag7 || flag8)
			if (isValidCharacter(c)) 
			{
				if (isPrintableCharacter(c) || flag5 || flag6) 
				{
					if (!flag5 && !flag6 || flag9) 
					{
						String s1 = super.getText();
						int i = s1.length();
						char ac[] = new char[i];
						int j = getCaretPosition();
						int k = getSelectionStart();
						int l = getSelectionEnd();
						if (k != l) {
						int i1 = k;
						setSelectionEnd(i1);
						j = k;
						setCaretPosition(j);
					}
					if (j <= i && ((j != 0 || !flag5) && (j != i || flag5))) 
					{
						int j1 = j;
						if (flag5) 
						{
							byte0 = -1;
							j1 += byte0;
						}
						char c1;
						if (nDefaultType != 3)
							c1 = !flag6 && !flag5 ? c : nDefaultType != 2 ? ' ' : '_';
						else
							c1 = !flag6 && !flag5 ? c : '0';
						if (s1.charAt(j1) == '/')
							j1 += byte0;
						for (int k1 = 0; k1 < i; k1++) {
							if (k1 == j1)
								ac[k1] = c1;
							else
								ac[k1] = s1.charAt(k1);
					}


					String s3 = new String(ac);
					if (isValidString(s3)) 
					{
						super.setText(s3);
						if (flag5)
							setCaretPosition(j1);
						else
							setCaretPosition(j1 + 1);
					}
				}
			}
			keyevent.consume();
		} 
		else
		if (flag8 || flag7)
			keyevent.consume();
		} 
		else 
			keyevent.consume();
		super.processKeyEvent(keyevent);
	}


	/**
	* Verifica se o dia, mês e ano são válidos ou não.
	*
	* @param nDay		Um inteiro contendo o dia.
	* @param nMonth		Um inteiro contendo o mês.
	* @param nYear		Um inteiro contendo o ano.
	*
	* @return	Um boolean true se verdadeiro ou false, caso contrário.
	*/
	public boolean isValidDate(int nDay, int nMonth, int nYear) 
	{
		if (nDay == 0)
		{		
		if (nDay < 1 || nDay > 31)
			return false;
		}
		if (nMonth == 0)
		{		
		if (nMonth < 1 || nMonth > 12)
			return false;
		}
		return nYear >= 0 && nYear <= 9999;
	}


	/**
	* Verifica se o mês e ano são válidos ou não.
	*
	* @param nMonth		Um inteiro contendo o mês.
	* @param nYear		Um inteiro contendo o ano.
	*
	* @return	Um boolean true se verdadeiro ou false, caso contrário.
	*/
	public boolean isValidMonthYear(int nMonth, int nYear)
	{
		if (nMonth <1 || nMonth > 12)
			return false;
		return nYear >0 && nYear <=9999;
	}
		
	/**
	* Verifica se o caracter é válido ou não.
	*
	* @param c		Um Char contendo o caractere a ser validado.
	*
	* @return	Um boolean true se verdadeiro ou false, caso contrário.
	*/
	private boolean isValidCharacter(char c) 
	{
		return (c < '!' || c > '/') && (c < ':' || c > '~');
	}


	/**
	* Verifica se o caracter pode ser impresso na tela ou não.
	*
	* @param c		Um Char contendo o caractere a ser mostrado.
	*
	* @return	Um boolean true se verdadeiro ou false, caso contrário.
	*/
	private boolean isPrintableCharacter(char c) 
	{
		return c >= ' ' && c <= '~';
	}


	/**
	* Verifica se a String é válida ou não.
	*
	* @param S		Uma String contendo a String a sere validada.
	*
	* @return	Um boolean true se verdadeiro ou false, caso contrário.
	*/
	private boolean isValidString(String s) 
	{
		return true;
	}


	/**
	* Retorna a data do campo.
	*
	* @param nDay		Um inteiro contendo o dia.
	* @param nMonth		Um inteiro contendo o mês.
	* @param nYear		Um inteiro contendo o ano.
	*
	* @return	Uma String contendo a data.
	*/
	private String createDateString(int nDay, int nMonth, int nYear) 
	{
		String s = "";
		if (nDefaultType != 3) 
		{
			if (nDay < 10)
				s = "0";
			s += String.valueOf(nDay);
			s += "/";
			if (nMonth < 10)
				s += "0";
			s += String.valueOf(nMonth);
			s += "/";
		}
		if (nYear < 1000) 
		{
			s += "0";
			if (nYear < 100) 
			{
				s += "0";
				if (nYear < 10)
					s += "0";
			}
		}
		s += String.valueOf(nYear);
		return s;
	}


	/**
	* Substitui uma determinada String dentro de outra.
	*
	* @param sSearched		Uma String contendo a String que será pesquisada.
	* @param sFind			Uma String contendo o que deve ser procurado na String.
	* @param sReplace		Uma String contendo o que deve ser substituído na String.
	*
	* @return	Uma String contendo a data.
	*/
	private static String replaceString(String sSearched, String sFind, String sReplace) 
	{
		String sReplaced = sSearched;


		if ((sReplaced != null) && (sReplaced.length() > 0)) 
		{
			int nPos = 0;
			int nFrom = 0;


			while (true) 
			{
				nPos = sReplaced.indexOf(sFind, nFrom);
				if (nPos != -1) 
				{
					sReplaced = sReplaced.substring(0, nPos) + sReplace + sReplaced.substring(nPos + sFind.length());
					nFrom = nPos + sReplace.length();
				}
				else
					break;
			}
		}
		return sReplaced;
	}


	/**
	* Limpa o JDateTextField.
	*/
	public void limpaData()
	{
		setDefaultType(1);
	}


	/**
	* Constrói um novo JDateTextField com o padrão de data DD/MM/AAAA.
	*/
	public JDateTextField() 
	{
		setDefaultType(1);
	}


	/**
	* Constrói um novo JDateTextField com uma data especificada.
	*
	* @param nDay		Um inteiro contendo o dia a ser mostrado.
	* @param nMonth		Um inteiro contendo o mês a ser mostrado.
	* @param nYear		Um inteiro contendo o ano a ser mostrado.
	*/
	public JDateTextField(int nDay, int nMonth, int nYear) 
	{
		this(nDay, nMonth, nYear, 0);
	}


	/**
	* Constrói um novo JDateTextField com o padrão especificado no parâmetro.
	*
	* @param i	Um inteiro contendo o padrão de data a ser utilizado.
	*/
	public JDateTextField(int i) 
	{
		this(1, 1, 2002, i);
		Calendar calendar = Calendar.getInstance();
		super.setText(createDateString(calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.MONTH)+1, calendar.get(Calendar.YEAR)));
	}


	/**
	* Constrói um novo JDateTextField com uma data especificada.
	*
	* @param nDay		Um inteiro contendo o dia a ser mostrado.
	* @param nMonth		Um inteiro contendo o mês a ser mostrado.
	* @param nYear		Um inteiro contendo o ano a ser mostrado.
	* @param 1			Padrão de data a ser utilizado (DD/MM/AAAA).
	*/
	public JDateTextField(int nDay, int nMonth, int nYear, int l) 
	{
		super("", l);
		nDefaultType = CURRENT_DATE;
		warningMessageActive = false;
		super.setText(createDateString(nDay, nMonth, nYear));
	}


	public static final int CURRENT_DATE = 0;


	public static final int BLANKS = 1;


	public static final int UNDERSCORES = 2;


	public static final int YEAR = 3;


	private static final int BACKSPACE = 8;


	private static final int DELETE = 127;


	private static final int PASTE = 22;


	private static final int CUT = 24;


	private int nDefaultType;


	private boolean warningMessageActive;
}

falow

Cara muito obrigado.

Falow,

Rafael,
Eu gerei uma classe e fui compilar o JDateTextField e deu esse erro na compilação:

Será que você poderia me dar uma ajuda ?

Obrigado desde já,

Frank…

aqui compilei e nao deu erro algum…a sintaxe eh essa mesmo…

tente compilar “no braco”…via console mesmo…

falow

Frank,

Trabalho com o Rafael e usamos esse componente. Ve se voce copio o codigo corretamente.
Da uma olhada na estrutura dos pacotes.
Esse componente dará suporte a sua necessidade.

[]´s

cara…trabalho com o Rafael e com o Thiago e fui um dos que mais apanhei deste componente… :lol: , pois quando achamos ele não entendiamos nada desse código…não sei se vc percebeu ou sabe, mas este componente eh um JTextField que deixa o field com formato “dd/mm/yyyy”…quando pegamos este componente, ele retornava a data corrente…acho que o que o Rafael passou nao retorna mais, pois foi alterado o contrutor do componente…no caso do erro de compilação, pelo que vi, é problema de pacotes, pois como o Rafael e o Thiago disse, não há erro algum…copie ele e salve em um arquivo, va até o prompt do ms-dos e compile ele como o amigo Rafael disse…com certeza funciona…se vc tiver mais alguma duvida ou pergunta sobre o componente, poste aqui ok?! :wink:

ate mais amigo…

[quote=Frank]Rafael,
Eu gerei uma classe e fui compilar o JDateTextField e deu esse erro na compilação:

Será que você poderia me dar uma ajuda ?

Obrigado desde já,[/quote]

Anos depois… :smiley:

Gente, esses caracteres que estão dando erro devem ter desaparecido por algum processamento no site.
Certamente são caracteres especiais tipo ‘\n’, ‘\t’, ‘\177’, etc, pois a variável c é do tipo char.

Alguem que participou deste tópico poderia olhar no fonte (funcionando) e me informar certinho esses códigos? :wink:

[]'s

Robert

Pessoal estou precisando deste código alguém tem ele corrigido ?
Obrigado!

tbem preciso validar as datas no meu software, alguem pode me ajudar, só preciso verificae se é uma data valida tipo 31/12/2010 e nao 35/12/5500.

Na realidade o ano 5500 é válido, concorda? Só seria um ano absurdo, mas é válido.
O que não é válido é o mês, neste caso.

Podes criar um Map com relação de meses válidos e outro de dias para cada mês, para efetuar o controle.
É algo que se passou rapidamente na cabeça.

Vou olhar a API Joda Time para ver se tem algo assim.
Uma dica, Calendar vai lhe ajudar bastante ai hein :slight_smile:

Abraços.

valew, minha aplicaçao é swing, hibernate, eu consegui formatar a data dd/MM/yyyy gravando e recuperando do banco, agora o problema é fazer uma função que valide estas datas.

Dê uma olhada aqui.
É demonstrado como isto é possível utilizando-se de GregorianCalendar.

É comentado que a excessão só é lançado caso a data seja inválida, por exemplo, 31 de fevereiro, caso você após setar a data manipule ela com o gregorian, então, faça isso.
Depois de setar a data dê um simples gc.get(Calendar.YEAR)) e trate a excessão, ai saberá se é ou não válida.

Se quiser melhorar isto, crie um método, fica mais “limpo” :slight_smile:

Abraços.