La risposta breve è:
- aggiungi "default-time-zone=utc" a mio.cnf
- nel tuo codice, "pensa" sempre in UTC, tranne quando visualizzi le date per i tuoi utenti
-
quando si ottengono/impostano date o timestamp con JDBC, utilizzare sempre il parametro Calendar, impostato su UTC:
resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- Sincronizza i tuoi server con NTP o affidati solo al server di database per dirti che ora è.
La risposta lunga è questa:
Quando si tratta di date e fusi orari in qualsiasi database e con qualsiasi codice client, di solito raccomando la seguente politica:
-
Configura il tuo database per utilizzare il fuso orario UTC , invece di utilizzare il fuso orario locale del server (a meno che non sia UTC ovviamente).
-
Come farlo dipende dal server del database. Le istruzioni per MySQL sono disponibili qui:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . Fondamentalmente devi scriverlo in my.cnf:default-time-zone=utc
-
In questo modo puoi ospitare i tuoi server di database ovunque, cambiare facilmente la tua posizione di hosting e, più in generale, manipolare le date sui tuoi server senza alcuna ambiguità.
- Se davvero preferisci utilizzare un fuso orario locale, ti consiglio almeno di disattivare l'ora legale, perché avere date ambigue nel tuo database può essere un vero incubo.
- Ad esempio, se stai realizzando un servizio di telefonia e stai utilizzando l'ora legale sul tuo server database allora stai chiedendo guai:non ci sarà modo di sapere se un cliente che ha chiamato dal "2008- 10-26 02:30:00" a "2008-10-26 02:35:00" effettivamente chiamato per 5 minuti o per 1 ora e 5 minuti (supponendo che l'ora legale sia avvenuta il 26 ottobre alle 3 del mattino)!
-
-
All'interno del codice dell'applicazione, utilizza sempre le date UTC, tranne quando mostri le date ai tuoi utenti.
- In Java, durante la lettura dal database, utilizzare sempre:
Timestamp myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- Se non lo fai, si presumerà che il timestamp sia nel tuo fuso orario locale, anziché UTC.
-
Sincronizza i tuoi server o affidati solo al tempo del server di database
-
Se hai il tuo server Web su un server (o più) e il tuo server database su un altro server, ti consiglio vivamente di sincronizzare i loro orologi con NTP.
-
OPPURE, affidati a un solo server per dirti che ora è. Di solito, il server del database è il migliore per chiedere tempo. In altre parole, evita codice come questo:
prepareStatement =connection.prepareStatement("UPDATE my_table SET my_time =? WHERE [...]");
java.util.Date now =new java.util.Date(); // ora locale! :-(
preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
int result =prepareStatement.execute();- Invece, affidati al tempo del server del database:
prepareStatement =connection.prepareStatement("UPDATE my_table SET my_time =NOW() WHERE [...]");
int result =prepareStatement.execute(); -
Spero questo sia di aiuto! :-)