Como subtrair datas

Galera, me surgiu uma dúvida hoje e como não consegui encontrar um jeito 100% correto de se fazer vim até o Guj. Preciso encontrar o número de dias entre duas datas.

2 dos vários links encontrados:

http://www.guj.com.br/posts/list/23768.java

http://www.guj.com.br/posts/list/9440.java

o meu código está parecido com um do Guj onde é subtraído o TimeInMillis() das datas. Para datas comuns deu certinho o meu código e os do Guj. Porém quando quero saber o intervalo 01/02/2008 a 01/03/2008 ele me retorna 31 dias, o que se formos contar não dá 31 dias. Até tem um código ai nos links onde diz ser considerado ano bissexto, mas nao deu certo. Nesse meu teste (01/02/2008 a 01/03/2008) alguém consegue obter o número de dias correto?? Vlw. !!!

Deve ser que aconteceu uma mudança de horário de verão entre essas duas datas. Em vez disso, veja se é possível usar o Joda-Time, porque tais coisas são bem chatinhas mesmo.

Cara eu fiz um algoritmo para um programa de agricultura em que o cara cadastra a nova aplicação de herbicidas e o sistema calcula automaticamente a data que o veneno é “vencido”. Não sei se é exatamente o que queres, mas acho que podes te ajudar.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package acoes;

/**
 * Casse DataFinal: Responsável em definir a data de termino 
 * @author jferreira
 */
public class DataFinal {

    private int dia;
    private int mes;
    private int ano;
    private int vetdias[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    private int intervalo;
    private int aux;
    private int aux2;

    public DataFinal(int dia, int mes, int ano, int intervalo) {
        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
        this.intervalo = intervalo;
        this.aux = mes - 1;
    }

    public String DefineData() {
        if (this.getAux() == 1) {
            if (this.isBissexto()) {
                this.setAux2(29 - this.getDia());
            } else {
                this.setAux2(29 - this.getDia());
            }
        } else {
            this.setAux2(vetdias[aux] - this.getDia());
        }

        if (this.getAux2() >= this.getIntervalo()) {
            
            this.setDia(this.getDia() + this.getIntervalo());
        } else {
            this.setIntervalo(this.getIntervalo() - this.getAux2());
            this.aux++;
            while (this.getIntervalo() > vetdias[aux]) {
                if (this.aux == 1) {
                    if (this.isBissexto()) {
                        this.setIntervalo(this.getIntervalo() - 29);
                        this.mes++;
                        this.aux++;
                    } else {
                        this.setIntervalo(this.getIntervalo() - vetdias[aux]);
                        this.mes++;
                        this.aux++;
                    }
                } else {
                    this.setIntervalo(this.getIntervalo() - vetdias[aux]);
                    this.aux++;
                    this.mes++;                    
                    if (this.getMes() > 12) {
                        this.mes = 1;
                        this.ano++;
                    }
                }
                if (this.getAux() == 12) {
                    this.aux = 0;
                }
            }
            if (this.getIntervalo() == 0) {
                this.setDia(1);
            } else {
                this.setDia(this.getIntervalo());
            }
            this.mes++;
        }        
        return this.getDia() + "/" + this.getMes() + "/" + this.getAno();
    }

    public int getIntervalo() {
        return this.intervalo;
    }

    public boolean isBissexto() {
        if (this.getAno() % 4 == 0 && this.getAno() % 100 != 0) {
            return true;
        } else {
            return false;
        }
    }

    private int getAno() {
        return this.ano;
    }

    public int getDia() {
        return dia;
    }

    public void setDia(int dia) {
        this.dia = dia;
    }

    public int getMes() {
        return mes;
    }

    public void setMes(int mes) {
        this.mes = mes;
    }

    public int getAux() {
        return aux;
    }

    public void setAux(int aux) {
        this.aux = aux;
    }

    public int getAux2() {
        return aux2;
    }

    public void setAux2(int aux2) {
        this.aux2 = aux2;
    }

    public void setAno(int ano) {
        this.ano = ano;
    }

    public void setIntervalo(int intervalo) {
        this.intervalo = intervalo;
    }
}
import java.util.Date;
import java.util.Calendar;
import java.text.*;

class DiferencaDatas {
    // Indica a diferença entre 2 datas, em dias. Não considera horas, minutos, segundos,
    // e tenta não levar em conta o malfadado horário de verão.
    // Retorna a diferença entre a data dt1 - a data dt2.
    /**
     */
    public static int difDatas (Date dt1, Date dt2) {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal1.setTime (dt1);
        cal2.setTime (dt2);
        cal1.set (Calendar.HOUR_OF_DAY, 2); // 2 horas para evitar certos problemas com horário de verão...
        cal1.set (Calendar.MINUTE, 0); 
        cal1.set (Calendar.SECOND, 0); 
        cal1.set (Calendar.MILLISECOND, 0);
        cal2.set (Calendar.HOUR_OF_DAY, 1); // 1 hora para evitar certos problemas com horário de verão... 
        cal2.set (Calendar.MINUTE, 0); 
        cal2.set (Calendar.SECOND, 0); 
        cal2.set (Calendar.MILLISECOND, 0);
        return (int) ((cal1.getTime().getTime() - cal2.getTime().getTime()) / (1000L * 60 * 60 * 24));
    }
    public static void main(String[] args) throws ParseException {
        DateFormat df = new SimpleDateFormat ("dd/MM/yyyy");
        // 2008 é bissexto, deve ter 29 dias
        System.out.println (difDatas (df.parse ("01/03/2008"), df.parse ("01/02/2008")));
        // O horário de verão 2008 vai começar em 19/10
        System.out.println (difDatas (df.parse ("31/10/2008"), df.parse ("01/10/2008")));
        // A mesma coisa aqui (o horário de verão 2009 vai terminar em 15/02)
        System.out.println (difDatas (df.parse ("28/02/2009"), df.parse ("01/02/2009")));
        // Sem horário de verão
        System.out.println (difDatas (df.parse ("31/07/2008"), df.parse ("01/07/2008")));
    }
}

Já tentou usar o método add da API Calendar? Fiz um teste pra responder um tópico, com data iniciando em um ano e terminando em outro, e ele imprimiu direitinho. Dá uma olhada e vê se te ajuda: http://www.guj.com.br/posts/list/103611.java