Diferença de datas em dias

4 respostas
D

Boa tarde,

Preciso calcular a diferença entre 2 datas em dias… porém é preciso considerar os meses que temos 28,30 ou 31 dias e os anos bissesto. Eu recupero do banco as duas datas como String e as transformo para int para fazer o calculo, mas acredito que já se tenha algo pronto em relação a essa minha situação e que não seria preciso eu reinventar a roda… alguem poderia me ajudar nesse meu caso?

abraços
Diego

4 Respostas

A

Fala,

Da uma olhada na biblioteca JodaTime. Tem varias funcoes prontas para calcular data e tempo, com certeza vai ter a solucao para o seu problema.

A url eh http://joda-time.sourceforge.net/

Espero que tenha ajudado,
Abracos,
Alan R.

C

Opa, você pode usar a classe Date do java para fazer as comparações.

Pode converter a data vinda do banco em java.util.Date, usando o SimpleDateFormat e depois usar o método compareTo da classe Date.

Exemplo:
data1.compareTo(data2);

O retorno será:

-1 => data1 menor q data2;

0 => data1 igual a data2;

1 => data1 maior q data2.

[]´s

fenrir

Esta é uma classe que achei no Google para fazer isso:

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

public class DateDiff {
    // set some constants that allow pretty accurate estimates over
    // about 2,000 years before or after the present. These are
    // slight overestimates since that's what we want (and need!)
    private static final double DAY_MILLIS = 1000 * 60 * 60 * 24.0015;
    private static final double WEEK_MILLIS = DAY_MILLIS * 7;
    private static final double MONTH_MILLIS = DAY_MILLIS * 30.43675;
    private static final double YEAR_MILLIS = WEEK_MILLIS * 52.2;


    public static int getDateDiff(int calUnit, Date d1, Date d2) {
        // swap if d1 later than d2
        boolean neg = false;
        if (d1.after(d2)) {
            Date temp = d1;
            d1 = d2;
            d2 = temp;
            neg = true;
        }

        // estimate the diff. d1 is now guaranteed <= d2
        int estimate = (int) getEstDiff(calUnit, d1, d2);

        // convert the Dates to GregorianCalendars
        GregorianCalendar c1 = new GregorianCalendar();
        c1.setTime(d1);
        GregorianCalendar c2 = new GregorianCalendar();
        c2.setTime(d2);

        // add 2 units less than the estimate to 1st date,
        // then serially add units till we exceed 2nd date
        c1.add(calUnit, (int) estimate - 2);
        for (int i = estimate - 1;; i++) {
            c1.add(calUnit, 1);
            if (c1.after(c2))
                return neg ? 1 - i : i - 1;
        }
    }


    private static int getEstDiff(int calUnit, Date d1, Date d2) {
        long diff = d2.getTime() - d1.getTime();
        switch (calUnit) {
            case Calendar.DAY_OF_WEEK_IN_MONTH:
            case Calendar.DAY_OF_MONTH:
                // case Calendar.DATE : // codes to same int as DAY_OF_MONTH
                return (int) (diff / DAY_MILLIS + .5);
            case Calendar.WEEK_OF_YEAR:
                return (int) (diff / WEEK_MILLIS + .5);
            case Calendar.MONTH:
                return (int) (diff / MONTH_MILLIS + .5);
            case Calendar.YEAR:
                return (int) (diff / YEAR_MILLIS + .5);
            default:
                return 0;
        } /* endswitch */
    }
}
mister_m

Melhor usar mesmo o Joda-Time ou você poderá encontrar problemas bem feios quando as datas contiverem um número ímpar de mudanças relativas ao horário de verão.

Criado 25 de abril de 2007
Ultima resposta 25 de abr. de 2007
Respostas 4
Participantes 5