Tenho um cálculo de data de vencimento de faturas, tem cliente que prefere que o vencimento seja feito para um determinado dia da semana (Ex: Quarta-feira = 4), já tenho o cálculo das datas das faturas.
Preciso que a data seja recalculada para a próxima semana e para o dia determinado no cadastro do cliente.
Digamos que a data caia numa Quinta-feita e no cadastro do cliente esteja que deve ser numa Quarta-feira, preciso que a data seja recalculada para a próxima quarta-feira, no meu código abaixo não está dando certo.
if(diaSemana < 7){
// 1=Domingo, 2=Segunda, etc…
int diaSemanaVencimento = calDataVencimento.get(Calendar.DAY_OF_WEEK);
int diaSemanaCliente = diaSemana + 1; // Ex: 4 = Quarta-feira
System.out.println("Data calculada…: "+calDataVencimento.getTime());
System.out.println("Dia semana calculado.: "+diaSemanaVencimento);
System.out.println("Dia semana no cliente: "+diaSemanaCliente);
if(diaSemanaVencimento != diaSemanaCliente){
// Se nao estiver do dia da semana que esta no cliente colocar no proximo
System.out.println(“Dia calculado diferente do dia no cadastro do cliente.”);
// Na linha abaixo não está pulando para o PRÓXIMO dia da semana
calDataVencimento.add(Calendar.DAY_OF_WEEK, diaSemanaCliente);
System.out.println("Data calculada 2.....: "+calDataVencimento.getTime());
}
System.out.println("----------------------------------------------------------");
}[/code]
Saída (veja que calculou para a próxima segunda-feira, mas preciso que seja para a próxima quarta-feira):
Data calculada.......: Thu Jan 14 07:43:02 BRST 2010
Dia semana calculado.: 5
Dia semana no cliente: 4
Dia calculado diferente do dia no cadastro do cliente.
Data calculada 2.....: Mon Jan 18 07:43:02 BRST 2010
Se você precisa trabalhar tanto com datas, esqueça a API nativa do Java, que é muito complexa, e comece a usar a Joda-time: http://joda-time.sourceforge.net/
Essa API não só é muito mais simples, como também foi proposta para uma futura versão do Java.
Entenda que Calendar é uma calculadora e Date é um ponto no tempo.
O algoritmo é simples : começando no dia calculado para o faturamento, encontre o proximo dia da semana que seja X
public Date nearestNextWeekDay(Date reference , int dayOfWeek){
Calendar calendar = Calendar.getInstance(); // ou new GregorianCalendar
calendar.clear();
calendar.setTime(reference);
while ( calendar.get(Calendar.DAY_OF_WEEK) != dayOfWeek){
calendar.add(Calendar.DAY_OF_MONTH,1); // verifica o proximo dia
}
// ao sair do while, a data no calendar será a que queremos
return calendar.getTime();
}
Quando trabalhar com datas nunca use cálculos aritméticos.