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

6 respostas
J

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.

...
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("----------------------------------------------------------");
}
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?

6 Respostas

V

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.

J

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

C

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!

J

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);

S

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.

J

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

Modifiquei e a solução final ficou assim:
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);
        }
    }
}
Criado 16 de setembro de 2009
Ultima resposta 16 de set. de 2009
Respostas 6
Participantes 4