n° 185
Maggio/Giugno 2013
Maggio 25, 2013, 06:36:18 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Date e Time ... da Resultset a Calendar  (Letto 658 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
SHARKSEAL
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 46


Mostra profilo
« inserita:: Giugno 29, 2012, 11:55:50 pm »

Ciao a tutti


Volendo mappare le date e le ore da mysql (ovvero il getDate o getTime) da Resultset a Calendar di java

quale sarebbe il modo migliore senza incorrere nelle solite problematiche di casting o conversioni ??

Esempio

avrei una tabella movimenti (Descrizione, data, ora) che da classico Resulset divrei mappare su un oggetto java movimento (Descrizione, data e time in formato calendar) la scelta è duvuta al fatto che Date e Time sono quasi deprecate ormai quindi avrei:

while (rs.next) ecc ecc

movimento = new Movimento (rs.getString("descrizione"), re.getDate ("data"), rs.getTime("ora"


ovviamente il costruttore movimento è  : Movimento ( String descrizione, Calendar data, Calendar ora)
stesso ragionamento al contrario ovvero quando devo inserire nel db un oggetto mappato sulla tabella
quindi le necessita' sono esattamente il contrario.

come potrei fare visto che si sono problemi di compatibilita' tra java.sql.Date e Calendar Che?!?

Grazie a tutti della disponibilità





Registrato
ctraversa
Jr. Member
**

Karma: +14/-7
Scollegato Scollegato

Messaggi: 155


Mostra profilo
« Risposta #1 inserita:: Giugno 30, 2012, 09:25:26 am »

Ciao SHARKSEAL

Citazione
problemi di compatibilita' tra java.sql.Date e Calendar
Puoi passare in qualsiasi momento da un oggetto all'altro semplicemente facendo:

Codice:
//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:
Codice:
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

Registrato
SHARKSEAL
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 46


Mostra profilo
« Risposta #2 inserita:: Giugno 30, 2012, 11:12:20 am »

Grazie ctraversa

Come sempre impeccabile nella spiegazione e gentilissimo come sempre

Ti spiego alcune scelte fatte:

La scelta della data e dell'ora in campi diversi deriva dal fatto che questi dati vengono presi così da byte streaming e mi è stato chiesto espressamente di memorizzare il tutto così perchè il db è comune ad altri applicativi che lavorano su campi diversi... avevo proposto l'idea del timestamp ecc ecc ... mi è stata bocciata l'idea senza possibilità di appello.  Concordo con te sulla programmazione pallosa (ecco il perchè della mia domanda ... ma come si dice "Lega l'asino dove il padrone dice"  Ghigno)

Più che altro il mio problemino nasce dal fatto che la data e l'ora spesso sono "null" e quando creo il calendar mi da nullpointer exception

nello specifico quando creo l'oggetto movimento ... sto avendo in po' di rognette a dir il vero

Grazie Occhiolino
Registrato
ctraversa
Jr. Member
**

Karma: +14/-7
Scollegato Scollegato

Messaggi: 155


Mostra profilo
« Risposta #3 inserita:: Luglio 01, 2012, 08:00:34 pm »

Se queste sono le "volontà del committente" è chiaro che si "attacca l'asino dove vuole il padrone". Sorriso
In tal caso il suggerimento è di definirti il costruttore col timestamp che poi con qualche riga di codice provvedi a dividere in un Date ed in un Time per poi chiamare il costruttore col Date e Time.

Nel caso del null invece girerei al cliente il problema semplicemente chiedendogli come vuole che il programma si debba comportare nel caso di data oppure orario mancante.
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page