2010-07-24 20 views

risposta

90

Nel lato Java, la data è solitamente rappresentata dal (poco progettato, ma a parte) java.util.Date. Fondamentalmente è supportato dal Epoch time nel sapore di un long, noto anche come timestamp. Contiene informazioni su entrambe le parti di data e ora. In Java, la precisione è in millisecondi.

Nel lato SQL, ci sono diversi data e ora tipi standard, DATE, TIME e TIMESTAMP (ad un certo DB chiamato anche DATETIME), che sono rappresentati in JDBC come java.sql.Date, java.sql.Time e java.sql.Timestamp, tutti sottoclassi di java.util.Date. La precisione dipende dal DB, spesso in millisecondi come Java, ma può anche essere in secondi.

Contrariamente allo java.util.Date, lo java.sql.Date contiene solo informazioni sulla parte relativa alla data (anno, mese, giorno). Time contiene solo informazioni sulla parte relativa all'ora (ore, minuti, secondi) e Timestamp contiene informazioni su entrambe le parti, ad esempio come java.util.Date.

La prassi normale per memorizzare un timestamp nel DB (quindi, java.util.Date nel lato Java e java.sql.Timestamp nel lato JDBC) è quello di utilizzare PreparedStatement#setTimestamp().

java.util.Date date = getItSomehow(); 
Timestamp timestamp = new Timestamp(date.getTime()); 
preparedStatement = connection.prepareStatement("SELECT * FROM tbl WHERE ts > ?"); 
preparedStatement.setTimestamp(1, timestamp); 

La prassi normale per ottenere un timestamp dal DB è quello di utilizzare ResultSet#getTimestamp().

Timestamp timestamp = resultSet.getTimestamp("ts"); 
java.util.Date date = timestamp; // You can just upcast. 
+6

pensi che l'uso di java.sql.Timestamp nel modello (livello Java) sia sbagliato? – cherouvim

+7

@cherouvim: Sì. Il modello non dovrebbe essere a conoscenza di alcuna specifica JDBC. Usalo solo per impostare il timestamp. 'preparedStatement.setTimestamp (new Timestamp (date.getTime()));'. Ottenere è facile dato che è già una sottoclasse di 'java.util.Date'. – BalusC

+1

Funzionerà correttamente se tutte le macchine e gli utenti si trovano nello stesso fuso orario. In caso contrario, fare attenzione alla gestione del driver JDBC MySQL delle conversioni del fuso orario è incredibilmente complessa e buggata. Ad esempio, consultare http: // StackOverflow.it/questions/40670532/what-are-jdbc-mysql-driver-settings-for-sane-handling-of-datetime-and-timestamp/40681941 # 40681941 –

6

MySQL documentation contiene informazioni sulla mappatura dei tipi di MySQL in tipi Java. In generale, per MySQL datetime e timestamp devi usare java.sql.Timestamp. Poche risorse includono:

http://dev.mysql.com/doc/refman/5.1/en/datetime.html

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

How to store Java Date to Mysql datetime...?

http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html

EDIT:

Come altri hanno indicato, il suggerimento di usare le stringhe può portare a problemi.

+0

perché sarebbe meglio convertire le date in stringhe? – cherouvim

+6

Non massaggiarlo avanti e indietro come una corda. È una ricetta per problemi di portabilità e manutenibilità. – BalusC

+0

concordato. Ho modificato la mia risposta di conseguenza. – Garett