Inconsistencia com datas

7 respostas
luistiagos

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?

7 Respostas

felipemartinsss

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

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

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::
public static List<String> 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<String> datas = new ArrayList<String>();
		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"));
	}
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.

luistiagos

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

sergiotaborda

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?

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)

B

sergiotaborda:
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?

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)

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…

sergiotaborda

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…

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)

luistiagos

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…

Criado 11 de março de 2008
Ultima resposta 12 de mar. de 2008
Respostas 7
Participantes 4