Mysql
 sql >> Database >  >> RDS >> Mysql

Come memorizzare un java.util.Date in un campo di timestamp MySQL nel fuso orario UTC/GMT?

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:

  1. 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)!
  2. 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.
  3. 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! :-)