Inconsistencia com datas

Bom dia tenho o seguinte codigo:

public static List getIntervaloDatas(String dtaInicial, String dtaFinal) throws ParseException {
		
	      DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
	    	
	      Calendar data = Calendar.getInstance();  
	      Date d = dateFormat.parse(dtaInicial);  
	      data.setTime(d);  

	      List datas = new ArrayList();
	      while(!dtaFinal.equals(dateFormat.format(data.getTime()))){ 
	      	datas.add(data.get(Calendar.DAY_OF_MONTH)+"/"+data.get(Calendar.MONTH)+"/"+data.get(Calendar.YEAR));  
	      	data.add(Calendar.DAY_OF_MONTH, 1);  
	      }
	      
	      datas.add(data.get(Calendar.DAY_OF_MONTH)+"/"+data.get(Calendar.MONTH)+"/"+data.get(Calendar.YEAR));
	      
	   return datas;
    }

Este codigo me retorna um list de datas no intervalo que é passado…
se eu colocar a data inicial com: “10/10/2008” e a data final como: “18/10/2008”
ele vai me retornar o dia “11/10/2008” repetido 2x, se eu colocar o intervalo como: 10/10/2007 e 18/10/2007
ele me traz o dia “13/10/2008” repetido… porem se eu colocar com o ano de 2005 ele nao me traz repetições…
alguem poderia me dizer o pq disto? o que esta acontecendo afinal?

Talvez eu esteja errado, mas… essas datas são geradas aleatóriamente?
O problema pode ser a pseudo-aleatoriedade.

[quote=felipemartinsss]Talvez eu esteja errado, mas… essas datas são geradas aleatóriamente?
O problema pode ser a pseudo-aleatoriedade.[/quote]

HUmm… só não vi onde se gera a data “pseudo-aleatoriedade”… mas tranquilo

Bom, eu copiei e colei o codigo aqui e executei… não dá erro não, nem repete a data… só uma observação é que se vc pegar direto o Calendar.MONTH e apresentar… o mes terá defasagem de 1, pq janeiro é 0.

Eu só alterei para usar o format, enatão ficou assim::[code]
public static List getIntervaloDatas(String dtaInicial,
String dtaFinal) throws ParseException {
DateFormat dateFormat = new SimpleDateFormat(“dd/MM/yyyy”);
Calendar data = Calendar.getInstance();
Date d = dateFormat.parse(dtaInicial);
data.setTime(d);
List datas = new ArrayList();
while (!dtaFinal.equals(dateFormat.format(data.getTime()))) {
datas.add(dateFormat.format(data.getTime()));
data.add(Calendar.DAY_OF_MONTH, 1);
}
datas.add(dateFormat.format(data.getTime()));
return datas;
}

public static void main(String[] args) throws ParseException {
	System.out.println("teste 1 ="+getIntervaloDatas("10/10/2008", "18/10/2008"));
	System.out.println("teste 2 ="+getIntervaloDatas("10/10/2007", "18/10/2007"));
}

[/code]

E executando a saida foi: teste 1 =[10/10/2008, 11/10/2008, 12/10/2008, 13/10/2008, 14/10/2008, 15/10/2008, 16/10/2008, 17/10/2008, 18/10/2008] teste 2 =[10/10/2007, 11/10/2007, 12/10/2007, 13/10/2007, 14/10/2007, 15/10/2007, 16/10/2007, 17/10/2007, 18/10/2007]

A meu ver esta correto.

Não as datas não sao aleatorios… o usuario coloca elas… mas estranho pq na minha maquina repete as datas?

[quote=luistiagos]
Este codigo me retorna um list de datas no intervalo que é passado…
se eu colocar a data inicial com: “10/10/2008” e a data final como: “18/10/2008”
ele vai me retornar o dia “11/10/2008” repetido 2x, se eu colocar o intervalo como: 10/10/2007 e 18/10/2007
ele me traz o dia “13/10/2008” repetido… porem se eu colocar com o ano de 2005 ele nao me traz repetições…
alguem poderia me dizer o pq disto? o que esta acontecendo afinal?[/quote]

Existe um detalhe no dia 10 de outubro: A mudança da hora de verão.
Por alguma razão o Calendar faz essa passagem no dia 10. Faça o teste fazendo o sistema gerar a lista de Date
verá que em certo ponto ele altera a hora e por isso ele gera duas datas iguais. Como vc está usando o format ele gera um date à meia-noite (quando muda a hora). Use o format para gerar datas ao meio-dia.
Não sei se existe uma forma mais simples de lidar com esse “problema” (na realidade não é um problema, o seu codigo é que não leva isso em consideação)

[quote=sergiotaborda][quote=luistiagos]
Este codigo me retorna um list de datas no intervalo que é passado…
se eu colocar a data inicial com: “10/10/2008” e a data final como: “18/10/2008”
ele vai me retornar o dia “11/10/2008” repetido 2x, se eu colocar o intervalo como: 10/10/2007 e 18/10/2007
ele me traz o dia “13/10/2008” repetido… porem se eu colocar com o ano de 2005 ele nao me traz repetições…
alguem poderia me dizer o pq disto? o que esta acontecendo afinal?[/quote]

Existe um detalhe no dia 10 de outubro: A mudança da hora de verão.
Por alguma razão o Calendar faz essa passagem no dia 10. Faça o teste fazendo o sistema gerar a lista de Date
verá que em certo ponto ele altera a hora e por isso ele gera duas datas iguais. Como vc está usando o format ele gera um date à meia-noite (quando muda a hora). Use o format para gerar datas ao meio-dia.
Não sei se existe uma forma mais simples de lidar com esse “problema” (na realidade não é um problema, o seu codigo é que não leva isso em consideação)[/quote]

Sergio,

mas como ele tá usando a propria api para fazer as “contas”, usando o: data.add(Calendar.DAY_OF_MONTH, 1); , eu acredito que este metodo já considere este problema…

[quote=BrunoCarlo]
Sergio,

mas como ele tá usando a propria api para fazer as “contas”, usando o: data.add(Calendar.DAY_OF_MONTH, 1); , eu acredito que este metodo já considere este problema…[/quote]

Era o que eu pensava. Eu tive o mesmo problema e descobri pq acontecia. Agora se é um bug ou não , não sei.
O que sei é que setando a primeira data (setTime()) para um data ao meio-dia, funciona. Tb funciona se mudar o locale, mas ai dá problema em outra data a menos que mude para um locale GMT+0 (que aliás seria o certo)

isto realmente so acontece no java 4 no java 5 foi corrigido… e é um bug na API Calendar… resolvi isto acrescentando mais 12 horas a data corrente isto resolveu meu problema… uma grande gambiarra mas fazer o que qdo é a API que esta bugada? ou faz uma nova com a correção que neste caso é loucura ou faz codigos alternativos(gambiarras) para contornar o bug…