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 telaStringdataGrupo=request.getParameter("dataGrupo");//Transformando a data de String (dd/MM/yyyy) para DateCalendarc=Calendar.getInstance();c.set(Integer.parseInt(dataGrupo.substring(6,10)),Integer.parseInt(dataGrupo.substring(3,5))-1,Integer.parseInt(dataGrupo.substring(0,2)));Datedata=c.getTime();//Criando uma data para comparar com o dia de hojeDatehoje=newDate();//O valor da variavel teste abaixo, nunca é zerointteste=data.compareTo(hoje);//Mesmo quando é exibido no console duas datas iguais, ao executar abaixoSystem.out.println(data);System.out.println(hoje);
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
thingol
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 telaStringdataGrupo=request.getParameter("dataGrupo");//Transformando a data de String para DateCalendarc=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)));Datedata=c.getTime();//Criando uma data para comparar com o dia de hojeDatehoje=newDate();hoje.setHours(0);hoje.setMinutes(0);hoje.setSeconds(0);//O valor da variavel teste abaixo, nunca é zerointteste=data.compareTo(hoje);//Mesmo quando é exibido no console duas datas iguais, ao executar abaixoSystem.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
thingol
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:
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
T
thingol
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:
StringdataGrupo=request.getParameter("dataGrupo");//Transformando a data de String para DateDatedata=newSimpleDateFormat("dd/MM/yyyy").parse(dataGrupo);//Criando uma data para comparar com o dia de hojeCalendarc=Calendar.getInstance();c.set(Calendar.HOUR_OF_DAY,0);c.set(Calendar.MINUTE,0);c.set(Calendar.SECOND,0);c.set(Calendar.MILLISECOND,0);Datehoje=c.getTime();
T
thingol
Ufa! Até que enfim você entendeu.
T
thingol
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.