Classe para validação de Data

7 respostas
igorfqueirozz

Gostaria de saber comoSalve Salve Java Men,

Gostaria que alguém me ajudasse nessa tarefa, segue o algoritmo.

  • Tem-se a data inicial e a data final.
  • Regras:

*Saber quantos anos COMPLETOS existem no intervalo da data inicial e a data final;
Multiplicar o resultado por 365

*Saber quantos meses completos existem nos anos INCOMPLETOS (os extremos)
Multiplicar o resultado por 30

*Somatório dos dias restantes dos meses extremos.

Peculiaridades:
Como o próprio algoritmo já revela, desconsidera-se os anos bissextos,
a não ser na data final, caso o mês seja Fevereiro e termine em 29 em um
ano bissexto, logo é contado como um mês completo (cai no cálculo: meses_de_anos_incompletos * 30)

Ainda na data final
Meses com término em 30 e 31 respeitam o final do mês ( ex: 30/12/2008 é considerado 30 dias e não 1 mês)

e por último, caso o somatório dos dias extremos ultrapasse 30 dias, esse mesmo é convertido em 1 mês e “N” dias

considera-se o primeiro dia da data inicial.

Obrigado galera, espero que alguém possa me ajudar ^^

7 Respostas

Mikhas

Talvez esse framework possa te ajudar cara

http://joda-time.sourceforge.net

igorfqueirozz

Obrigadão Mikhas, vou dar uma olhada
nessa framework. qualquer coisa recomendo por aqui mesmo ^^

jj_df

Esse framework resolve sim, eu já brinquei com ele mas mexendo com horas…

Se tiver muitos problemas posta q eu te ajudo!!!

É bem tranquilo, baixa o javadoc q dá pra mexer, bem intuitivo.

igorfqueirozz

Agradeço a atenção, ainda estou estudando a framework.
Quando eu terminar, eu mostro aqui como ficou

sf.marcius

pelo jeito vc quer calcular a diferença de duas datas em dias… ou em dias + meses + anos…
certo?

se for isso, tbém ja tive essa necessidade e aeh vai:

import java.util.Calendar;
import java.util.GregorianCalendar;

public class teste
{
    public static void main(String[] args)
    {
        Calendar d1 = new GregorianCalendar(2001, Calendar.FEBRUARY, 28);
        Calendar d2 = new GregorianCalendar(2008, Calendar.JANUARY, 04);
        Integer[] dif = diferencaEntreDatas(d1, d2);
        System.out.println("data 2 é " + dif[0] + " anos, "
                + dif[1] + " meses e " + dif[2] + " dias maior que data 1");
        Integer difDias = diferencaEntreDatasEmDias(d1, d2);
        System.out.println("ou seja, " + difDias + " dias maior que data 1");
    }

    // a diverenca sera retornada em {anos, meses, dias}
    public static Integer[] diferencaEntreDatas(final Calendar date1,
                                                 final Calendar date2)
    {
        if (date2.compareTo(date1) < 0) {
            throw new RuntimeException("Data 2 deve ser igual ou maior que data 1");
        }
        Calendar d1 = (Calendar) date1.clone();
        Calendar d2 = (Calendar) date2.clone();

        // desconsidera a hora contida nos objetos
        d1.set(Calendar.HOUR_OF_DAY, 0);
        d1.set(Calendar.MINUTE, 0);
        d1.set(Calendar.SECOND, 0);
        d1.set(Calendar.MILLISECOND, 0);

        d2.set(Calendar.HOUR_OF_DAY, 0);
        d2.set(Calendar.MINUTE, 0);
        d2.set(Calendar.SECOND, 0);
        d2.set(Calendar.MILLISECOND, 0);

        int anos = 0, meses = 0, dias = 0;
        Calendar tmp = (Calendar) date1.clone();
        tmp.setLenient(true);
        while (true) {
            tmp.add(Calendar.YEAR, 1);
            if (tmp.compareTo(d2) > 0) {
                tmp.add(Calendar.YEAR, -1);
                anos = tmp.get(Calendar.YEAR) - d1.get(Calendar.YEAR);
                break;
            }
        }

        while (true) {
            tmp.add(Calendar.MONTH, 1);
            if (tmp.compareTo(d2) > 0) {
                tmp.add(Calendar.MONTH, -1);
                meses = tmp.get(Calendar.MONTH) - d1.get(Calendar.MONTH);
                break;
            }
        }
        tmp.add(Calendar.DAY_OF_MONTH,
            d1.get(Calendar.DAY_OF_MONTH) - tmp.get(Calendar.DAY_OF_MONTH));
        long d2time = d2.getTimeInMillis() + d2.get(Calendar.DST_OFFSET);
        long d1time = tmp.getTimeInMillis() + tmp.get(Calendar.DST_OFFSET);
        
        dias = (int) ((d2time - d1time) / (24 * 60 * 60 * 1000));
        return new Integer[]{anos, meses, dias};
    }

    public static Integer diferencaEntreDatasEmDias(final Calendar date1,
                                              final Calendar date2)
    {
        if (date2.compareTo(date1) < 0) {
            throw new RuntimeException("Data 2 deve ser igual ou maior que data 1");
        }
        Calendar d1 = (Calendar) date1.clone();
        Calendar d2 = (Calendar) date2.clone();

        // desconsidera a hora contida nos objetos
        d1.set(Calendar.HOUR_OF_DAY, 0);
        d1.set(Calendar.MINUTE, 0);
        d1.set(Calendar.SECOND, 0);
        d1.set(Calendar.MILLISECOND, 0);

        d2.set(Calendar.HOUR_OF_DAY, 0);
        d2.set(Calendar.MINUTE, 0);
        d2.set(Calendar.SECOND, 0);
        d2.set(Calendar.MILLISECOND, 0);

        // pega o tempo em milisegs das datas + offset (desloc de Horario de verao)
        long d1time = d1.getTimeInMillis() + d1.get(Calendar.DST_OFFSET);
        long d2time = d2.getTimeInMillis() + d2.get(Calendar.DST_OFFSET);

        // calcula a diferenca em milisegs
        return (int) ((d2time - d1time) / (24 * 60 * 60 * 1000));
    }
}

acho que se isso nao resolver, pelo menos ajuda :slight_smile:

[]s

jj_df

Essa solução com o GregorianCalendar é muito boa, se precisar de algo mais, o que não acho q vai precisar, use o framework joda-time.

Ele é melhor pra mexer com hora, pq o GregorianCalendar é um pouco chato nesse ponto.

sf.marcius

realmente, mexer com datas e horas em java é chato.

por exemplo, tava convertendo um script feito em linguagem lua, para cálculo de juros…
e em lua, pra saber a diferença em dias entre duas datas era simples:

diferenca = dataMaior - dataMenor

ja em java, tem que fazer toda essa naba… e pior, tem que ter cuidado, pq as vezes aparecem uns poréns chatos de resolver.

por exemplo, se a diferença entre duas datas for de, digamos 8 anos, não é só multiplicar 8 por 365 pra ter a quantidade de dias, pois tem que ver os anos bissestos, que ao contrário do que se pensa, não ocorrem necessariamente de 4 em 4 anos.

Além disso, em java, a data e a hora são guardados num mesmo objeto. se eu fizer:
data1 = new GregorianCalendar();
agora, data1 conterá, nesse momento 08/01/2009 16:20 …
se eu quiser fazer a diferença entre uma nova data, digamos

“09/01/2009” - data1

teremos que prestar atenção para as horas contidas nos objetos (mesmo que a hora nao seja importante no nosso algoritmo), pois a conta poderá não dar o “1 dia” esperado.

bem que podia ter uma api nativa para cálculos em cima de datas em java :stuck_out_tongue:

Criado 7 de janeiro de 2009
Ultima resposta 8 de jan. de 2009
Respostas 7
Participantes 4