Calendar - Intervalo de datas

5 respostas
S

Olá novamente,

estou contruindo uma aplicação que faz um agendamento automatico de certos processos em que o ponto importante é o dia da semana escolhido de um intervalo de datas (que já foi estabelecido pelo usuario).

como:

Exibir todas as quintas feiras da data entre 31/01/2010 a 31/08/2010

Gostaria de saber se alguem possui um exemplo pratico ou se é possivel fazer isso com Calendar (sem o uso de um componente externo ao java.)

5 Respostas

A

apesar de gostar de trabalhar com jodaTime, da pra fazer isso com o Uso do Calendar sim.

F

Bom cara isso você poderia fazer com Quartz.

www.quartz-scheduler.org

Baixa a biblioteca e dá uma olhada nos exemplos que vocÊ vai conseguir fazer isso ai tranquilo.

Abraço

E

Eu também aconselho a usar o Quartz (imagine quantos bugs você vai ter na sua aplicação até ela funcionar direitinho se você mesmo for fazer toda a lógica. Evite essa dor de cabeça).

De qualquer maneira, vamos listar as quintas-feiras de 31/01/2010 a 31/08/2010:

import java.util.*;
import java.text.*;

class ListarQuintasFeiras {
    private static DateFormat df = new SimpleDateFormat ("dd/MM/yyyy");
    public static Calendar parseCal (String dd_mm_yyyy) throws ParseException {
            Date dt = df.parse (dd_mm_yyyy);
            Calendar cal = Calendar.getInstance();
            cal.setTime (dt);
            return cal;
    }
    public static void main (String[] args) throws Exception {
        Calendar c1 = parseCal ("31/01/2010");
        Calendar c2 = parseCal ("31/08/2010");
        for (Calendar c = (Calendar) c1.clone(); c.compareTo (c2) <= 0; c.add (Calendar.DATE, +1)) {
            if (c.get (Calendar.DAY_OF_WEEK) == Calendar.THURSDAY)
                System.out.println (df.format (c.getTime()));
        }
    }
}
S

é o tcc.

não que eu nao possa usar uma api no projeto, mas o prazo é curto e o estudo de algo a mais demanda tempo.

mas, se quiser coloque o codigo com o quartz também (se não for incomodo).

é bom ter mais opções.

e, nesse caso o que vc fez já serve em muito.

a data que o usuario passa já foi validada com o proprio calendar por outro método.

o processo agora é armazenar o intervalo.

pra cada dia do intervalo é um insert no banco.

e mto obrigado aos que postaram.

S

bem, olá novamente.

o processo citado acima trancorria normalmente, até eu me deparar com os valores exatos dos dias.

supondo a data 04/10/2012 como data de inicio e 28/10/2012 como data do termino do intervalo que eu quero (incluindo as datas citadas), deveriam ser exibidas 4 ocorrencias de datas (já que eu quero a lista de quinta a domingo deste intervalo, são 4 quintas, sextas, sabados e domingos).

Porem, se eu exatamente o intervalo, a ultima data de domingo (a unica que nao excede) ela não é retornada no método.

os metodos que estou usando:

Util.class
private static Calendar parseCal (String dd_mm_yyyy) throws ParseException {
        DateFormat df = new SimpleDateFormat ("dd/MM/yyyy");

    		Date dt = df.parse (dd_mm_yyyy);
            Calendar cal = Calendar.getInstance();
            cal.setTime (dt);
            return cal;
    }
public static ArrayList<String> getListaDomingo(String dataInicio, String dataFim) throws Exception{
		ArrayList<String> lista = new ArrayList<String>();
        DateFormat df = new SimpleDateFormat ("dd/MM/yyyy");
        Calendar inicio = parseCal (dataInicio);
        Calendar fim = parseCal (dataFim);
        
        for (Calendar c = (Calendar) inicio.clone(); c.compareTo (fim) <= 0; c.add (Calendar.DATE, +1)) {
        	if (c.get (Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
            	lista.add(df.format(c.getTime()));
        }
		return lista;
	}
Main.class
list = Util.getListaDomingo		("06/10/2012", "28/10/2012");
			System.out.println("Domingo");
			for (int i = 0; i < list.size(); i++) {
				System.out.println(list.get(i));
			}
o resultado é este aqui:
Domingo
07/10/2012
14/10/2012
21/10/2012

sendo que o ideal:

Domingo
07/10/2012
14/10/2012
21/10/2012
28/10/2012
e, se eu coloco uma saida dos dias no metodo da classe Util (uma linha no for do metodo getListaDomingo)
System.out.println(c.get(Calendar.DAY_OF_WEEK));
ele devolve isto:
5 //quinta
6 //sexta
7 //sabado
1 //domingo
2 //segunda
3 //terça
4 //quarta
5
6
7
1
2
3
4
5
6
7
1
2
3
4
5
6
7 //aqui o sabado - mas ele encerra aqui o loop

como faço para o intervalo contar também com o dia especificado para o termino dele?

Criado 30 de setembro de 2010
Ultima resposta 20 de out. de 2010
Respostas 5
Participantes 4