Newsgroup: it.comp.java
Titolo: 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
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

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


  Dunque devo confrontare una data che estraggo da un campo DATE di Oracle
[cut]
Ciao, forse non sono la persona più adatta a risponderti. Utilizzo Java da 
pochissimo e non ho mai aiutato nessuno, fino ad ora. Ma nell'applicazione 
che ho portato avanti c'è un metodo molto simile. Te lo posto, così magari 
mi dici che ne pensi.
Questo metodo è incapsulato in una classe (Data, appunto) per cui i gli 
attributi giorno,mese e anno che vedi sono propri della Classe.
La chiamata è tipo DATA1.compareTo(DATA2) e restituisce valore >0 o <0 a 
seconda del risultato del Confronto.
<code - sono sicuro che l'indentazione si perderà>
 public int compareTo(Data D) {
	/* D.getAnno è più grande, restituisce un valore minore di Zero */
        if(anno - D.getAnno() < 0)
            return anno - (D.getAnno());
        if(anno - D.getAnno() == 0)
        {
	    /* Se i valori sono uguali confronta prima i mesi, poi i giorni */
            if(mese.compareTo(D.getMese()) < 0)
                return mese.compareTo(D.getMese());
            if(D.getMese().compareTo(mese) == 0)
                return giorno - (D.getGiorno());
            else
                return (D.getMese().compareTo(mese));
        } else
        {
	    /* D.getAnno è più piccolo, restituisce un valore maggiore di Zero */
            return anno - (D.getAnno());
        }
    }
</code>
-- 
Cathàll - 
www.interisti.org
HT: Djurgårdens IT (233519)

Cathàll ha scritto:





ok ma cmq nella tua classe devi arrivare ad avere mese, giorno e anno
quindi in qualche maniera te li devi ricavare, insomma quel che dico è che
devi pur passare dalle classi  java (Calendar o qualcunaltra)
non son sicuro che usando la classe che hai fatto tu e del codice che si
ricava anno,mese  e giorno(che cmq servono alla tua classe) la cosa
semplifica di molto
cmq grazie


 quindi in qualche maniera te li devi ricavare,
beh, l'unico modo per farlo è 
cal = new GregorianCalendar();
cal.get(QUELLO CHE VUOI)


 confronto.
Ci sono anche i metodi after() e before() dall'ovvio significato, nel 
Calendar (quindi non serve il getTime() per ottenere l'oggetto Date). 
Non è che li abbia usati di recente, ma se non sbaglio se vuoi 
confrontare delle date  "senza le ore" dovresti azzerare i campi che non 
ti servono. Mi sembra la cosa più logica (e anche meno rischiosa, come 
dici nel tuo secondo messaggio); non mi pare che ci sia un qualche 
metodo in Calendar per dire 'valido da anno a giorno, del resto 
impipatene', un pò come i campi datetime di Informix, per chi li conosce 
(si possono fare cose tipo "datetime year to day").
bye
DKano

 cal.get(QUELLO CHE VUOI)
eh ok ma a quel punto dovrei scrivere un sacco di codice


DKano ha scritto:


si ho visto after e before ma preferisco usare il compareTo del date
perchè può restituire 3 tipi di valori e non 2 (nel senso che quando le
date sono identiche restituisce 0).
quindi (apparte after, before e compareTo) dici che ho agito in maniera
corretta???


 corretta???
Credo di si, sicuramente è meglio azzerare l'inutilizzato. Ripeto, a 
meno che non ci siano appositi metodi per indicare quali campi siano 
significativi non vedo altre possibilità
bye
DKano