Como encontrar a próxima data pelo dia da semana? (RESOLVIDO)

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.

[code]…
calDataVencimento.add(Calendar.DAY_OF_MONTH, prazo);

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

Alguém pode dar alguma dica?

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.

Tem razão Vinicius mas infelismente nesse projeto não posso adicionar mais nenhuma API, vou ter que me virar com o GregorianCalendar mesmo.

fala ae cara, tudo bom

espero ter ajudado, segue um código abaixo para o seu problema

	public static void main(String[] args) {
		
		int diaSemanaCliente = 4; // TODO quarta-feira, por exemplo
		
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, 14);
		calendar.set(Calendar.MONTH, Calendar.JANUARY);
		calendar.set(Calendar.YEAR, 2010);
		
		System.out.println("          Data Calculada: " + calendar.getTime());
		
		System.out.println(" Dia da semana calculada: " + calendar.get(Calendar.DAY_OF_WEEK));
		System.out.println("Dia da semana do cliente: " + diaSemanaCliente);
		
		if(diaSemanaCliente != calendar.get(Calendar.DAY_OF_WEEK)) {
			System.out.println("\nDia calculado diferente do dia no cadastro do cliente");
			
			while(calendar.get(Calendar.DAY_OF_WEEK) != diaSemanaCliente) {
				calendar.add(Calendar.DAY_OF_MONTH, 1);
			}

			System.out.println("**** Nova Data Calculada: " + calendar.getTime());
		}
	}

abraços!

Obrigado amigão, eu tinha resolvido assim (ainda não deu tempo de postar a solução):

int dif = 0; if (diaSemanaVencimento < diaSemanaCliente) { dif = diaSemanaCliente - diaSemanaVencimento; } else { dif = (7 - diaSemanaVencimento) + diaSemanaCliente; } calDataVencimento.add(Calendar.DAY_OF_MONTH, dif);

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.

Verdade verdadeira, os dois que responderam o tópico tem razão.

Modifiquei e a solução final ficou assim:

[code]if (diaSemana < 7) {
int diaSemanaCliente = diaSemana + 1; // Ex: 4 = Quarta-feira

if (diaSemanaCliente != calDataVencimento.get(Calendar.DAY_OF_WEEK)) {
    while (calDataVencimento.get(Calendar.DAY_OF_WEEK) != diaSemanaCliente) {
        calDataVencimento.add(Calendar.DAY_OF_MONTH, 1);
    }
}

} else {
if (listaDiasFora.size() > 0) {
while (listaDiasFora.indexOf(calDataVencimento.get(Calendar.DAY_OF_MONTH)) > -1) {
calDataVencimento.add(Calendar.DAY_OF_MONTH, 1);
}
}
}[/code]