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.
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