Calcular datas no loop

12 respostas
E
preciso gravar datas na sequencia acrescentando meses a uma data específica, estou tentando assim:
SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
        Calendar c = new GregorianCalendar();
        c.setTime(new Date());

        for (int i = 0; i < 12; i++) {
            c.add(Calendar.MONTH, i);
            System.out.println(sd.format(c.getTime()));
        }
mas a saida sai assim:
01/09/2010
01/10/2010
01/12/2010
01/03/2011
01/07/2011
01/12/2011
01/06/2012
01/01/2013
01/09/2013
01/06/2014
01/04/2015
01/03/2016
as datas não estão saindo na sequência correta, como fazer para que as datas sejam sequencias mês a mês.

12 Respostas

nel

Você deseja que seja ordenado por mês, é isto?

Algo como:

01/01/2010
01/02/2010
01/03/2010
//e assim por diante

Abraços.

O
c.add(Calendar.MONTH, 1);
E

isso, preciso que as datas sejam ordenadas por mes na sequencia a
partir de uma data especifica para gravar datas de compras parceladas
no banco.

ja estou fazendo isso no loop, mas não sai na sequencia certa.

c.add(Calendar.MONTH, i);
nel

Bom, estou de saída mas ai vai uma sugestão.
Crie uma classe que implemente a interface Comparator de modo a efetuar comparação entre meses.

Cria uma List de Calendar e aplique o seu “Comparator”. Algo assim:

List<Calendar> datas = new ArrayList<Calendar>(); //após ter adicionado todas as datas datas.sort(valores, new SuaClasseComparator());

Se preferir podes criar uma Lista de Date e tratar este Date com um Calendar dentro da classe Comparator, o que creio que seria mais adequado.
Abraços!

B

Edulemos: o que o Oziz falou está correto

c.add(Calendar.MONTH, 1);

Ao invés de voce colocar a váriavel i, coloque 1. A cada loop no seu laço, o sistema adicionará um mes. Se voce deixar o i ele vai adicionar 1 mes, 2 meses, 3 meses e assim por diante.

Ficaria assim então
SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
        Calendar c = new GregorianCalendar();
        c.setTime(new Date());

        for (int i = 0; i < 12; i++) {
            c.add(Calendar.MONTH, 1);
            System.out.println(sd.format(c.getTime()));
        }
01/10/2010
01/11/2010
01/12/2010
01/01/2011
01/02/2011
01/03/2011
01/04/2011
01/05/2011
01/06/2011
01/07/2011
01/08/2011
01/09/2011
LeoMarola

Objetos Calendar são pesados demais… crie vários a menos que vc realmente precise de uma instância diferente de cada.

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class TesteCalendar {

	
	public static void main(String[] args) {
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		
		Calendar calendar = Calendar.getInstance();
		for (int i = 0; i < 10; i++) {
			calendar.add(Calendar.MONTH, 1);
			System.out.println(sdf.format(calendar.getTime()));
		}
	}
}

deve te atender.

Quando vc recupera o Calendar, o Date já é o atual… não precisa setar.

O metodo getInstance ja deverá te retornar uma instancia de GregorianCalendar :wink:

ViniGodoy

De onde surgiu essa informação de que são “pesados” demais? Pesados em que? Memória? Performance?
Acho muitíssimo improvável que eles vão dar qualquer problema na aplicação, embora seu código seja mesmo marginalmente mais eficiente.

LeoMarola

Oi Viny,

me refiro a nível de memória, tamanho do objeto. o Calendar agrega diversas informações que provavelmente não deverão ser usadas, as vezes simplesmente vamos precisar de dia/mes/ano e não das demais informações.

ViniGodoy

Olhando aqui, vi que ambos os códigos criam o mesmo número de calendars, tanto o seu, quanto o dele. Não houve otimização no seu código por usar o getInstance(), já que o getInstance() cria um novo calendar. A única diferença é que o getInstance() baseia-se em informações do local da plataforma onde o java estiver rodando, então seu código é mais multiplataforma.

Só dei o alerta pois performance dificilmente é uma justificativa plausível. Otimização prematura é tão prejudicial quanto não otimizar. Agora, claro que se não houver perda de legibilidade (como é o caso do seu código), uma otimizaçãozinha é sempre bem-vinda. :slight_smile:

nel

Este tipo de discussão é sempre bem-vinda, pois no meu caso, agrega valores.
Mas edulemos, o seu problema foi resolvido? Se não foi, aplicou a ideia que eu citei acima?

Caso tenha sido resolvido, poste a solução pois outros podem vir a ter a mesma necessidade que a sua ok?

Abraços! :slight_smile:

E

Ok resolvido, as vezes agente não enexerga o problema
na nossa frente, obrigado a todos.

LeoMarola

ViniGodoy:
Olhando aqui, vi que ambos os códigos criam o mesmo número de calendars, tanto o seu, quanto o dele. Não houve otimização no seu código por usar o getInstance(), já que o getInstance() cria um novo calendar. A única diferença é que o getInstance() baseia-se em informações do local da plataforma onde o java estiver rodando, então seu código é mais multiplataforma.

Só dei o alerta pois performance dificilmente é uma justificativa plausível. Otimização prematura é tão prejudicial quanto não otimizar. Agora, claro que se não houver perda de legibilidade (como é o caso do seu código), uma otimizaçãozinha é sempre bem-vinda. :slight_smile:

Com certeza Viny, está certo!

Criado 1 de setembro de 2010
Ultima resposta 1 de set. de 2010
Respostas 12
Participantes 6