Amigo… agora surgiu uma duvida aqui… eu achei muito interessante o algoritmo do amigo acima, mas implementaria diferente.
Resolvi implementar e acabou dando uma diferença de cálculo.
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Dias {
public static void main(String[] args) {
int dias = 300;
Date dataHoje = new Date();
Calendar calendarioHoje = new GregorianCalendar();
calendarioHoje.setTime(dataHoje);
Calendar calendarioFim = new GregorianCalendar();
calendarioFim.setTime(dataHoje);
calendarioFim.add(Calendar.DATE, dias);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
System.out.println(sdf.format(calendarioHoje.getTime()) + " - " + sdf.format(calendarioFim.getTime()));
int qtdAnos = calendarioFim.get(Calendar.YEAR) - calendarioHoje.get(Calendar.YEAR);
calendarioHoje.add(Calendar.YEAR, qtdAnos);
if (calendarioHoje.after(calendarioFim)) {
qtdAnos--;
calendarioHoje.add(Calendar.YEAR, -1);
}
int qtdMeses = mesesEntre(calendarioHoje, calendarioFim);
calendarioHoje.add(Calendar.MONTH, qtdMeses);
if (calendarioHoje.after(calendarioFim)) {
qtdMeses--;
calendarioHoje.add(Calendar.MONTH, -1);
}
int qtdDias = diasEntre(calendarioHoje, calendarioFim);
System.out.println(qtdAnos + " - " + qtdMeses + " - " + qtdDias);
}
public static int mesesEntre(Calendar hoje, Calendar fim){
Calendar cinicial = new GregorianCalendar();
Calendar cfinal = new GregorianCalendar();
cinicial.setTime(hoje.getTime());
cfinal.setTime(fim.getTime());
int count = 0;
while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)
|| cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){
if (cinicial.after(cfinal)) {
cfinal.add(Calendar.MONTH, 1);
} else {
cfinal.add(Calendar.MONTH, -1);
}
count ++;
}
return count;
}
public static int diasEntre(Calendar hoje, Calendar fim){
Calendar cinicial = new GregorianCalendar();
Calendar cfinal = new GregorianCalendar();
cinicial.setTime(hoje.getTime());
cfinal.setTime(fim.getTime());
int count = 0;
while (!cinicial.equals(cfinal)){
if (cinicial.after(cfinal)) {
cfinal.add(Calendar.DATE, 1);
} else {
cfinal.add(Calendar.DATE, -1);
}
count ++;
}
return count;
}
}
Se considerarmos 300 dias, o algoritmo do amigo volta 9 meses e 27 dias.
O meu volta 9 meses e 24 dias.
Fazendo a conta “na unha”…
Hoje - 23/05 - Até 23/06 - 31 dias
Até 23/07 - 61 dias
Até 23/08 - 92 dias
Até 23/09 - 123 dias
Até 23/10 - 153 dias
Até 23/11 - 184 dias
Até 23/12 - 214 dias
Até 23/01 - 245 dias
Até 23/02 - 276 dias
300 dias - 276 dias = 24 dias!
E agora surgiu a duvida??? Qual dos 2 algoritmos esta errado?? Até que ponto a lógica do meu programa é mais correta?
Esta diferença parece estar acontecendo por causa do mês de fevereiro… Acredito que seja porque no algoritmo do amigo, ele pega a data final e vai diminuindo ano, depois mês, e depois dia, ou seja, ele diminui 28 dias de fevereiro, enquanto no meu caso eu vou aumentando a data (conforme a conta acima)… Fiquei na duvida agora. Qual caso seria efetivamente o mais correto ?