Comparison between dates

5

I'm trying to validate the inclusion of dates in my system, referring to the batch of products, but I think I'm a bit hasty in the way I'm doing.

For what I need, I thought of 3 situations that I should control, which would be them:

  

The date of manufacture can not be later / greater than the expiration date;

     

The expiration date can not be earlier / shorter than the manufacturing date (it seems somewhat redundant if you look at the 1st validation);

     

The expiration date can not be less than the current date;

I made a simple simple and lean example, just to illustrate, and to point out errors in comparing dates.

  public class ValidaData extends JFrame {

    JLabel labelFab = new JLabel("Fabricação: ");
    CampoData fabricacao = new CampoData();

    JLabel labelVal = new JLabel("Validade: ");
    CampoData validade = new CampoData();

    JButton botao = new JButton("Calcular");

    public ValidaData() {
        setSize(500, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel painel = new JPanel();
        painel.setLayout(new FlowLayout());

        painel.add(labelFab);
        painel.add(fabricacao);

        painel.add(labelVal);
        painel.add(validade);

        painel.add(botao);
        botao.setPreferredSize(new Dimension(90, 20));
        botao();
        add(painel);
    }

    private void botao() {
        botao.addActionListener((ActionEvent e) -> {
            valida();
        });
    }

    Date dataAtual;

    private boolean valida() {
        if (fabricacao.getValor().compareTo(validade.getValor()) != 0) {
            JOptionPane.showMessageDialog(null, "A data de fabricação, não pode ser posterior a data de validade!");
            fabricacao.requestFocus();
            return false;
        } 

        else if (validade.getValor().compareTo(fabricacao.getValor()) != 0) {
            JOptionPane.showMessageDialog(null, "A data de validade, não pode ser anterior a data de fabricação!");
            validade.requestFocus();
            return false;
        }

        else if (validade.getValor().compareTo(dataAtual = new Date()) != 0) {
            JOptionPane.showMessageDialog(null, "A data de validade esta vencida !");
            validade.requestFocus();
            return false;

        } else {
            JOptionPane.showMessageDialog(null, "Deu certo !!");
            return true;
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(()
                -> {
            ValidaData e = new ValidaData();
            e.setVisible(true);
        });
    }
}

class CampoData extends JFormattedTextField {

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

    public CampoData() {
        setColumns(6);
        try {
            MaskFormatter mf = new MaskFormatter("##/##/####");
            mf.install(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setValor(Object valor) {
        setText(sdf.format((Date) valor));
    }

    public Date getValor() {
        try {
            SimpleDateFormat sdft = new SimpleDateFormat("dd/MM/yyyy");
            return sdft.parse(getText());
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possível obter a data!");
            e.printStackTrace();
            return null;
        }
    }
}
    
asked by anonymous 02.09.2017 / 18:53

1 answer

4

Use the methods after and before of class util.Date to compare dates, instead of compareTo :

private boolean valida() {
    if (fabricacao.getValor().after(validade.getValor())) {
        JOptionPane.showMessageDialog(null, "A data de fabricação, não pode ser posterior a data de validade!");
        fabricacao.requestFocus();
        return false;
    } 

    else if (validade.getValor().before(fabricacao.getValor())) {
        JOptionPane.showMessageDialog(null, "A data de validade, não pode ser anterior a data de fabricação!");
        validade.requestFocus();
        return false;
    }

    else if (validade.getValor().before(dataAtual = new Date())) {
        JOptionPane.showMessageDialog(null, "A data de validade esta vencida !");
        validade.requestFocus();
        return false;

    } else {
        JOptionPane.showMessageDialog(null, "Deu certo !!");
        return true;
    }
}

I recommend reading this answer regarding the new java date API, how and why to migrate to it .

    
02.09.2017 / 19:02