Como calcular a diferença em dias entre datas

6 respostas
M

Eai gente, seguinte, tenho dois Date, e quero saber a diferença em dias entre esses objetos. Sei fazer o cálculo trabalhando com o getTime() do Date, mas não queria fazer calculeira em cima de long, e sim gostaria de achar algo na API que fizesse isso automágico pra mim, dado os objetos. Procurei na GregorianCalendar mas não achei nada, alguém pode ajudar?

Por ex, algo como isso:

Date date1 = new Date();
Date date2 = new Date();

long diferencaEmDias = date1 - date2;

Obs: Pra Java 1.4.

6 Respostas

P

oi Matheus,

vê se isso ajuda:

public final long getDateDiff(Timestamp dataSubtracao) {

// Monta data final
    GregorianCalendar calendarioDataFinal = 
        new GregorianCalendar(dataHora.get(Calendar.YEAR),
        dataHora.get(Calendar.MONTH), dataHora.get(Calendar.DAY_OF_MONTH));

    // Monta data inicial
    GregorianCalendar dataInicial = new GregorianCalendar();
    dataInicial.setTimeInMillis(dataSubtracao.getTime());
    
    GregorianCalendar calendarioDataInicial = 
        new GregorianCalendar(dataInicial.get(Calendar.YEAR),
        dataInicial.get(Calendar.MONTH), dataInicial.get(Calendar.DAY_OF_MONTH));

    // Calcula a diferença entre a data final menos a inicial
    long diferenca = calendarioDataFinal.getTimeInMillis() - calendarioDataInicial.getTimeInMillis();
    
    // Converte a diferença de milesegundos para minutos 
    long minutos = diferenca / (MILESEGUNDOS * SEGUNDOS);
    
    // Converte a diferença de minutos para dias 
    long dias = minutos / MINUTOS;
                    
    return dias;
}

[]'s
Paula

M

Oi Paula, obrigado pela resposta, mas, como comentei, o cálculo com time in millis eu sei fazer, e é exatamente isso que eu não queria. O que quero é achar alguma API que faça isso por mim, onde eu passe as datas e me retorne, ou algo parecido, mas sem eu ter que fazer os cálculos, por questões de simplifcação de código e clareza. :wink:

C
public int calculaQtdeDias (String argDataCI, String argDataCO) {
       String dataCI [] = argDataCI.split("/"); 
       String dataCO [] = argDataCO.split("/");     
       int anoCI = Integer.parseInt(dataCI[2]);
       int anoCO = Integer.parseInt(dataCO[2]);
       Calendar calendar = GregorianCalendar.getInstance(timeZone, locale);
       calendar.set(anoCO, Integer.parseInt(dataCO[1]), Integer.parseInt(dataCO[0]));
       int diaCO = calendar.get(Calendar.DAY_OF_YEAR);
       calendar.set(anoCI, Integer.parseInt(dataCI[1]), Integer.parseInt(dataCI[0]));
       int diaCI = calendar.get(Calendar.DAY_OF_YEAR);
       int anoBissexto = 0;
       while (anoCO < anoCI)
          anoBissexto+=isAnoBissexto (anoCO++);
       return (diaCO - diaCI) + ((anoCO - anoCI) * 365 + anoBissexto);   
  }

 private final int isAnoBissexto (int ano) {
        if ( (ano%4==0 && ano%100 !=0) || ano%400==0)
           return 1;
        return 0;
    }
L

Oi Matheus

Eu achei um framework chamado Jota-time:
http://joda-time.sourceforge.net/index.html

Ele faz isso e ainda tem diversas outras funcões.

Pelo que testei funciona direitinho:

DateTime d1 = new DateTime(2006, 5, 17, 0, 0, 0, 0);
		DateTime d2 = new DateTime(System.currentTimeMillis());

		Days days = Days.daysBetween(d1, d2);
		System.out.println(days.getDays());
C

opa !!!
vivendo e aprendendo !!!
depois dessa, fiquei até com vergonha do meu código, heheheheh.
mas não tem problema não, da próxima vez eu já uso esse framework ai.
vlw !!

R

Utilizando a nova API de datas do java fica um exemplo abaixo:

LocalDate data1 = //Data 1;
LocalDate data2 = //data 2;
Period p = Period.between(data1, data2);
System.out.println("DIFERENCA EM DIAS: "+p.getDays());
Criado 17 de maio de 2007
Ultima resposta 25 de set. de 2014
Respostas 6
Participantes 5