Ajuda: compareTo() para Date não funciona de jeito nenhum (RESOLVIDO)

13 respostas
ataufo

Pessoal,

estou tendo um problema que não consigo entender, o metodo compareTo() não retorna zero nem com macumba! Segue o código abaixo:

//Pegando a data da tela
				String dataGrupo = request.getParameter("dataGrupo");
				//Transformando a data de String (dd/MM/yyyy) para Date
				Calendar c = Calendar.getInstance();
				c.set(Integer.parseInt(dataGrupo.substring(6,10)),
					  Integer.parseInt(dataGrupo.substring(3,5))-1,
					  Integer.parseInt(dataGrupo.substring(0,2)));
				Date data = c.getTime();
				
				//Criando uma data para comparar com o dia de hoje
				Date hoje = new Date();
				
				//O valor da variavel teste abaixo, nunca é zero
				int teste = data.compareTo(hoje);
				
				//Mesmo quando é exibido no console duas datas iguais, ao executar abaixo
				System.out.println(data);
				System.out.println(hoje);

Alguém vê algum sentido para isso???

Obrigado !!!

13 Respostas

Felagund

O Calendar funciona um pouco diferente.

se vc for formatar a data use SimpleDateFormat, não o calendar.

A API de datas do java é meio ruim de se trabalhar, por isso tem uma nova, que provavelmente saira no Java 7, o calendar deve estar retornando a data com alguns milisegundos, por isso ha diferença.

ataufo

e como ficaria a conversão de String para Date, com SimpleDateFormat ?

T

Imprima os valores de “data” e “hoje” para ver o que você está fazendo de errado. Basicamente, no primeiro caso, a hora está como meia-noite; no segundo caso, a hora está como a hora atual. Seu “compare” só vai funcionar exatamente à meia noite e zero milésimos de segundo, o que obviamente não é o que você quer.

Para obter a data de hoje, para efetuar a comparação, use:

Calendar calHoje = Calendar.getInstance(); // pega a data e hora atuais
calHoje.set (Calendar.HOUR_OF_DAY, 0); calHoje.set (Calendar.MINUTE, 0); calHoje.set (Calendar.SECOND, 0); calHoje.set (Calendar.MILLISECOND, 0);
Date hoje = calHoje.getTime();
ataufo

rapaz, já impimiu isso:
Thu Jun 04 16:47:03 BRT 2009
Thu Jun 04 16:47:03 BRT 2009

e não retornou zero, acredito que seja essa questão ai do milisegundo mesmo, faz sentido. Tenho que ver como faz essa conversão com SimpleDateFormat pra ver se resolve…

Alguem sabe ??

ataufo

Fiz o que o thingol sugeriu e não funcionou, segue abaixo:

//Pegando a data da tela
				String dataGrupo = request.getParameter("dataGrupo");
				//Transformando a data de String para Date
				Calendar c = Calendar.getInstance();
				c.set (Calendar.HOUR_OF_DAY, 0); 
				c.set (Calendar.MINUTE, 0); 
				c.set (Calendar.SECOND, 0); 
				c.set (Calendar.MILLISECOND, 0);
				c.set(Integer.parseInt(dataGrupo.substring(6,10)),
					  Integer.parseInt(dataGrupo.substring(3,5))-1,
					  Integer.parseInt(dataGrupo.substring(0,2)));
				Date data = c.getTime();
				
				//Criando uma data para comparar com o dia de hoje
				Date hoje = new Date();
				hoje.setHours(0); hoje.setMinutes(0); hoje.setSeconds(0);
				
				//O valor da variavel teste abaixo, nunca é zero
				int teste = data.compareTo(hoje);
				
				//Mesmo quando é exibido no console duas datas iguais, ao executar abaixo
				System.out.println("localiza" + data);
				System.out.println("localiza" + hoje);

Exibição no Console:
localizaThu Jun 04 00:00:00 BRT 2009
localizaThu Jun 04 00:00:00 BRT 2009

Valor da variavel teste = -1

???

Felagund

não imprima o Date, imprima o date.getTime(), ai vc vai ver a diferença.

T

Eu não falei para você fazer

Date hoje = new Date();  
 hoje.setHours(0); hoje.setMinutes(0); hoje.setSeconds(0);

Isso porque não existe um método chamado “setMilliseconds” em java.util.Date.

renanreismartins

cara o thingol respondeu ai como resolve seu problema é só fazer como ele sugeriu…

outra coisa, vc quer saber como funciona a SimpleDateFormat. no google o terceiro resultado apresentado é esse:

http://www.javafree.org/topic-855834-Date-e-SimpleDateFormat.html

nao esqueça: google = melhor amigo

abrasssss

ataufo

Thingol,
eu tentei fazer sem o “hoje.setHours(0); hoje.setMinutes(0); hoje.setSeconds(0);”, porém um ficou com o horário atual e o outro com 00:00:00 e não funcionou também.

Segue a exibição com o getTime() e sem a linha acima:
localiza1244084400000
localiza1244148375921

Felagund,

segue a exibição:
localiza1244084400000
localiza1244084400265

Eu já tinha reparado essa diferença no Debug, mas como resolver essa diferença é a questão rs. Ta difícil. Obrigado a todos ae.

Se tiverem mais ideias to aceitando :slight_smile:

T

Repostando o que eu fiz:

Calendar calHoje = Calendar.getInstance(); // pega a data e hora atuais  
 calHoje.set (Calendar.HOUR_OF_DAY, 0); calHoje.set (Calendar.MINUTE, 0); calHoje.set (Calendar.SECOND, 0); calHoje.set (Calendar.MILLISECOND, 0);  
 Date hoje = calHoje.getTime();

Eu NÃO disse para usar setHour, setMinute e setSecond da classe java.util.Date, até porque
a) esses métodos estão “deprecated” (obsoletos), e
b) não existe um “setMillisecond” em java.util.Date.

ataufo

Pessoal Obrigado,

Resolvido da seguinte forma:

String dataGrupo = request.getParameter("dataGrupo");
				//Transformando a data de String para Date
				Date data = new SimpleDateFormat("dd/MM/yyyy").parse(dataGrupo);   
				//Criando uma data para comparar com o dia de hoje
				Calendar c = Calendar.getInstance();  
				c.set (Calendar.HOUR_OF_DAY, 0); c.set (Calendar.MINUTE, 0); c.set (Calendar.SECOND, 0); c.set (Calendar.MILLISECOND, 0);     
				Date hoje = c.getTime();
T

Ufa! Até que enfim você entendeu.

T

Na prática, devido àqueles problemas de horário de verão e outras coisas medonhas, eu costumo sempre normalizar as horas para “01:00:00” (em vez de “00:00:00”), isso porque o Java sabe que naqueles dias em que começa o horário de verão (sábado para domingo) o horário pula das 23:59:59 de sábado para 01:00:00 de domingo, ou seja, não existe nesses domingos a hora 00:00:00, o que dá muita confusão.

Criado 4 de junho de 2009
Ultima resposta 4 de jun. de 2009
Respostas 13
Participantes 4