Comparando data

7 respostas
CarlosFontana

Boa tarde pessoal, procurei pelo fórum mas não encontrei uma situação parecida com a que eu tenho, é o seguinte, tenho um atributo campoData que é do tipo da classe “MinhaData”, estou com dificuldades em fazer com que no momento em que o usuário inserir uma data que seja maior que a data atual do sistema, o sistema emite uma mensagem informando que não é permitido datas futuras, ou seja, apenas data atual. Tentei fazer um método comparado com after, mas não consegui fazer funcionar, segue a classe MinhaData, se alguém tiver uma ideia eu agradeço, até mais!

package Componentes;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JOptionPane;
import javax.swing.text.MaskFormatter;

public class MinhaData extends MeuJFormattedTextField {

    public GregorianCalendar data = new GregorianCalendar();

    public MinhaData(String dica, boolean obrigatorio) {
        super(dica, obrigatorio, 6);
        try {
            System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(new Date()));
            MaskFormatter mf = new MaskFormatter("##/##/####");
            mf.setValidCharacters("[telefone removido]");
            mf.install(this);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possível Data");
        }
    }

    @Override
    public boolean eValido() {
        try {
            if (getText().trim().length() != 10) {
                return false;
            }
            SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
            sf.setLenient(false);
            Date data = sf.parse(getText());
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public boolean eVazio() {
        if (getText().equals("  /  /    ")) {
            return true;
        } else {
            return false;
        }
    }

    public void setText(Date date) {
        setText(new SimpleDateFormat("dd/MM/yyyy").format(data));
    }

    public Date getValor() {
        try {
            return (Date) new SimpleDateFormat("dd/MM/yyyy").parse(getText());
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possivel formatar a data.");
            return null;
        }
    }

    public void pegaData() {
        setText(new SimpleDateFormat("dd/MM/yyyy").format(new Date()));
    }

7 Respostas

leonardobhbr

A Classe data tem os seguintes metodos

equals  = Datas iguais
after = Data posterior
before = Data inferior
marllondsp
Segue exemplo:

public boolean validationDate(){

Date dataAtualSistema = new Date(System.currentTimeMillis());
if(dataDigitada.before(dataAtualSistema )|| dataDigitada.after(dataAtualSistema)){
    	addActionError("é permitido sómente a data atual");
    	return true;
    }
	return false;
}
fernandopaiva

Não use Date() para isso…Use Calendar ou JodaTime

veja.

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");  
String data = "01/01/2011";  
Calendar cal1 = Calendar.getInstance();  
Calendar cal2 = Calendar.getInstance();  
cal1.setTime(sdf.parse(data));  
  
if(ca1.compareTo(cal2)){  
   System.out.println("iguais");  
}  
//compareTo
//after
//before

t+ e boa sorte

marllondsp

por que voce não usa Jquery?

CarlosFontana

Obrigado pelo esclarecimento, mas não consegui fazer a comparação pois o campoData é de um tipo e está formatado conforme a classe “MinhaData”
para comparar acredito que tenho que transformar a data do sistema para que fique semelhante ao campoData

if (campoData.equals(campoData)) {
               JOptionPane.showMessageDialog(null, "Mesma data!");
            }

… o código acima é um tanto quanto óbvio mas eu acredito que tenho que pegar a data do sistema e transforma-lá como a informação do campoData que é um objeto do tipo (“MinhaData”) caso contrário ele não conseguirá comparar, sou novato, desculpa qualquer coisa :S .

discorpio

Boa noite a todos.

Tanto a Classe Date como a GregorianCalendar, possuem um método denominado "compareDateTo(Date AnotherDate), que retorna um valor inteiro, se for zero (0), as datas são iguais, se for menor que zero (-1), a data fornecida no parâmetro é maior do que a data que invocou o método, caso seja maior que zero (1), a data fornecida é menor do que a data que invocou o método.

É só dar uma olhada nos links abaixo:

http://www.esus.com/javaindex/j2se/jdk1.2/javautil/dates/comparingdates.html

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Date.html#compareTo(java.util.Date)

http://www.mkyong.com/java/how-to-compare-dates-in-java/

Um abraço

CarlosFontana

Obrigado Discorpio, esses links foram de grande ajuda e estou quase lá, hehe, o único problema é que quando eu gravo no banco ele grava apenas a data e a hora está zerada, a validação está comparando as horas também, por isso diz que a data atual é sempre maior que a data gravada!

Método que está na classe minhaData

public void ComparaData(Date data) { 
        Date hoje = new Date();
        Date dataInformada = data;

        SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
        formatador.format(hoje);
        formatador.format(dataInformada);

        JOptionPane.showMessageDialog(null, "Minha data é: " + dataInformada);
        JOptionPane.showMessageDialog(null, "A data de hoje é:" + hoje);
        if(hoje.compareTo(dataInformada)<0)
             JOptionPane.showMessageDialog(null, "A data de hoje é menor que a data informada");
        else if(hoje.compareTo(dataInformada)>0)
             JOptionPane.showMessageDialog(null, "A data de hoje é maior que a data informada");
        else
             JOptionPane.showMessageDialog(null, "Datas iguais");
    }

Passando parâmetro / Classe estado

campoData.ComparaData(campoData.getValor());

Recordo de ter visto um tópico onde comentava algo de comparar somente a data e ignorando as horas, vou verificar, caso alguém tenha conhecimento eu agradeço!

Até mais!

Criado 29 de novembro de 2011
Ultima resposta 4 de dez. de 2011
Respostas 7
Participantes 5