|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
[JAVA]confronto date con GregorianCalendar
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 |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 252
|
Ciao ma non potevi usare direttamente il metodo before di Date, ti ritorna true se la data è anteriore di quella passata come argomento.
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
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 |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
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 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:28.



















