Ciao SHARKSEAL
problemi di compatibilita' tra java.sql.Date e Calendar
Puoi passare in qualsiasi momento da un oggetto all'altro semplicemente facendo:
//Da java.util.Date a java.sql.Date e java.util.Calendar
java.util.Date date = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
java.util.Calendar calendar = new java.util.GregorianCalendar();
calendar.setTime(date);
//Da java.util.Calendar a java.util.Date e java.sql.Date
java.util.Calendar calendar = new java.util.GregorianCalendar();
java.util.Date date = new java.util.Date(calendar.getTimeInMillis());
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
//Da java.sql.Date a java.util.Date e java.util.Calendar
java.sql.Date sqlDate = new java.sql.Date(new java.util.Date().getTime()); //Non esiste il costruttore vuoto per java.sql.Date
java.util.Date date = new java.util.Date(sqlDate.getTime());
calendar.setTime(date);
Il problema nel tuo caso mi sembra piuttosto legato al fatto che hai memorizzato in due differenti campi data e orario. Se avessi definito un unico campo in mysql di tipo DATETIME O TIMESTAMP per memorizzare data ed ora ti sarebbe tornato tutto più semplice. Anzi, nel caso del TIMESTAMP avresti pure ottimizzato la memoria poichè in mysql hai
+---------------------+
| Tipo | Memoria |
|-----------|----------|
|YEAR | 1 byte |
|DATE | 3 bytes |
|TIME | 3 bytes |
|DATETIME | 8 bytes |
|TIMESTAMP| 4 bytes |
+---------------------+
per cui DATE e TIME sono 6 byte mentre TIMESTAMP 4 byte.
Invece dal momento che hai utilizzato due diversi campi ti toccherà fare qualcosa del tipo:
java.sql.Date date = rs.getDate("data");
java.sql.Time time = rs.getTime("ora");
Calendar cal = new GregorianCalendar();
//Recuperi la data
cal.setTime(date);
//Recuperi l'orario
cal.set(Calendar.HOUR, time.getHours());
cal.set(Calendar.MINUTE, time.getMinutes());
In questo modo sull'oggetto Calendar hai tutte le informazioni ma diventa una palla la programmazione.
Il mio consiglio, se ne hai la possibilità, è quello di cambiare proprio il costruttore ed aggiustare il codice di tutte le classe che già lo istanziano.
Se invece il lavoro da fare fosse troppo potresti crearti per la classe movimento un costruttore con un timestamp dentro. Qualcosa del tipo:
movimento = new Movimento (Descrizione, TimeStamp)
Dentro tale costruttore suddividendo con poco codice il TimeStamp in Date e Time istanzi il costruttore vecchio movimento = new Movimento (Descrizione, data, ora)
Ci guadagni che nel while fai semplicemente
movimento = new Movimento (rs.getString("descrizione"), rs.getTimestamp("TIMESTAMP"));
Ovviamente devi modificare la struttura della tabella passando dai 2 campi di date e time a quello timestamp ma questa cosa è molto semplice da fare. Devi solo giocare 5 min col DB con una ALTER TABLE ADD COLUMN ed una query di UPDATE per popolare il nuovo campo timestamp partendo dal Data e Time