PDA

View Full Version : [JAVA]confronto date con GregorianCalendar


prazision
01-06-2005, 17:57
Dunque devo confrontare una data che estraggo da un campo DATE di Oracle con la data di oggi per vedere quale viene prima (ovviamente le 2 date possono anche coincidere)
Ho pensato(più che altro è la prima cosa che ho trovato :-) ) di usare l'oggetto GregorianCalendar e il metodo compareTo dell'oggetto Date per il confronto.
Ho quindi usato il seguente codice per estrarre la data di oggi:

GregorianCalendar c=new GregorianCalendar() ;
Date data di oggi=c.getTime();

e il seguente codice per avere la data dal db:

String select="SELECT...";
Resultset rs = stmt.executeQuery(sel);
if(rs.next()) {
Date dataDb=rs.getDate("DATA");
}
GregorianCalendar c2=new GregorianCalendar() ;
c2.setTime(dataDb);
Date dataDaConfrontare=c2.getTime();


Ecco facendomi stampare le 2 date ottengo(in questo caso anche nel db c'è la data di oggi):
data di oggi: Jun 01 17:55:08 CEST 2005
data nel db: Jun 01 00:00:00 CEST 2005

il confronto col compareTo() risulta quindi impreciso in quanto da una parte ci sono minuti ecc. e dall'altra no(e in un caso come quello sopra ad esempio le 2 date non risulterebbero uguali per via dei minuti ecc.)-
ho quindi agito così:

Data di oggi:
GregorianCalendar c=new GregorianCalendar() ;
Date dataOggi=c.getTime();


Data db:
String select="SELECT...";
Resultset rs = stmt.executeQuery(sel);
if(rs.next()) {
Date dataDb=rs.getDate("DATA");
}
GregorianCalendar c2=new GregorianCalendar();
c2.setTime(dataDb);
int giorno2=c2.get(Calendar.DAY_OF_MONTH);
int anno2=c2.get(Calendar.YEAR);
int mese2=c2.get(Calendar.MONTH);
GregorianCalendar k2=new GregorianCalendar() ;
k2.set(anno2, mese2, giorno2);
Date dataDBfinale=k2.getTime();

Ok ora dataOggi e dataDBfinale sono confrontabili e tutto funziona; il codice non mi sembra però molto pulito e bello.

in particolare è questa parte(nel mio codice):
int giorno2=c2.get(Calendar.DAY_OF_MONTH);
int anno2=c2.get(Calendar.YEAR);
int mese2=c2.get(Calendar.MONTH);
GregorianCalendar k2=new GregorianCalendar() ;
k2.set(anno2, mese2, giorno2);

che mi lascia insoddisfatto ma d'altra parte non riesco a fare altro per avere due date confrontabili(tra laltro a me di confrontare minuti,secondi e ore non frega nulla)

Che potevo fare (sempre usando GregorianCalendar)???
C'è anche qualche oggetto diverso (e migliore) rispetto a GregorianCalendar??
Intanto che qualcuno risponde cerco anchio di migliorare il codice

ciao e grazie

orpheus
01-06-2005, 18:54
Ciao ma non potevi usare direttamente il metodo before di Date, ti ritorna true se la data è anteriore di quella passata come argomento.

prazision
02-06-2005, 12:47
Ciao ma non potevi usare direttamente il metodo before di Date, ti ritorna true se la data è anteriore di quella passata come argomento.

lunedì provo ma dubito funzion; infatti quando io estraggo la data dal db

if(rs.next()) {
Date dataDb=rs.getDate("DATA");
}
//e magari faccio anche il passo successivo:

GregorianCalendar c2=new GregorianCalendar();
c2.setTime(dataDb);
Date dataDBfinale=c2.getTime();
//


ottengo una data con minuti, secondi e ore posti a 0 e quindi il metodo before() immagino non possa confrontare tale data con quella di oggi

GregorianCalendar c=new GregorianCalendar() ;
Date dataOggi=c.getTime();
(oppure ottenuta usando direttamente l'oggetto Date)

infatti questa seconda data avrà anche i minuti ecc. e il confronto (in caso le date coincidano per quanto riguarda giorno mese e anno) non funzionerebbe.
io ho bisogno di avere 2 date che abbiano lo stesso valore per i minuti per le ore e per i secondi in modo da poter confrontare solo giorno mese e anno(anche perchè a me il resto non interessa)

grazie

prazision
02-06-2005, 14:41
guardando il codice mi è sembrato meglio complicarlo ultriormente :-)

infatti(ho provato con mysql e non con oracle) sono giunto alla conclusione che è meglio scrivere così:

Data di oggi:
GregorianCalendar c=new GregorianCalendar() ;
c.set(Calendar.HOUR, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
Date dataOggi=c.getTime();


Data db:
String select="SELECT...";
Resultset rs = stmt.executeQuery(sel);
if(rs.next()) {
Date dataDb=rs.getDate("DATA");
}
GregorianCalendar c2=new GregorianCalendar();
c2.setTime(dataDb);
int giorno2=c2.get(Calendar.DAY_OF_MONTH);
int anno2=c2.get(Calendar.YEAR);
int mese2=c2.get(Calendar.MONTH);
GregorianCalendar k2=new GregorianCalendar() ;
k2.set(anno2, mese2, giorno2);
k2.set(Calendar.HOUR, 0);
k2.set(Calendar.MINUTE, 0);
k2.set(Calendar.SECOND, 0);
k2.set(Calendar.MILLISECOND, 0);
Date dataDBfinale=k2.getTime();

in questo modo son sicuro che entrambe le date avranno minuti,secondi ecc uguali a 0 e pertanto saranno confrontabili solo giorno mese e anno (prima invece settavo all'interno della data del db i minuti ecc allo stesso valore che avevano nella data odierna ma mi sembra rischioso)

la faccenda si complica...

cmq grazie