Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stocker un java.util.Date dans un champ d'horodatage MySQL dans le fuseau horaire UTC/GMT ?

La réponse courte est :

  • ajouter "default-time-zone=utc" à my.cnf
  • dans votre code, "pensez" toujours en UTC, sauf lors de l'affichage des dates pour vos utilisateurs
  • lors de l'obtention/définition de dates ou d'horodatages avec JDBC, utilisez toujours le paramètre Calendar, défini sur UTC :

    resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

  • soit synchroniser vos serveurs avec NTP, soit compter uniquement sur le serveur de base de données pour vous dire l'heure qu'il est.

La réponse longue est la suivante :

Lorsque je traite des dates et des fuseaux horaires dans n'importe quelle base de données et avec n'importe quel code client, je recommande généralement la politique suivante :

  1. Configurez votre base de données pour utiliser le fuseau horaire UTC , au lieu d'utiliser le fuseau horaire local du serveur (sauf s'il s'agit bien sûr de l'UTC).

    • La manière de procéder dépend de votre serveur de base de données. Les instructions pour MySQL peuvent être trouvées ici :http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . En gros, vous devez écrire ceci dans my.cnf :default-time-zone=utc

    • Vous pouvez ainsi héberger vos serveurs de base de données n'importe où, changer facilement de lieu d'hébergement et plus généralement manipuler les dates sur vos serveurs sans aucune ambiguïté.

    • Si vous préférez vraiment utiliser un fuseau horaire local, je vous recommande au moins de désactiver l'heure d'été, car avoir des dates ambiguës dans votre base de données peut être un véritable cauchemar.
      • Par exemple, si vous construisez un service de téléphonie et que vous utilisez l'heure d'été sur votre serveur de base de données, alors vous posez des problèmes :il n'y aura aucun moyen de savoir si un client qui a appelé de "2008- 10-26 02:30:00" à "2008-10-26 02:35:00" a effectivement appelé pendant 5 minutes ou pendant 1 heure et 5 minutes (en supposant que l'heure d'été ait eu lieu le 26 octobre à 3 heures du matin) !
  2. Dans le code de votre application, utilisez toujours des dates UTC, sauf lorsque vous affichez des dates pour vos utilisateurs.

    • En Java, lors de la lecture à partir de la base de données, utilisez toujours :

    Horodatage maDate =resultSet.getTimestamp("ma_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

    • Si vous ne le faites pas, l'horodatage sera supposé être dans votre fuseau horaire local, au lieu de UTC.
  3. Synchronisez vos serveurs ou comptez uniquement sur l'heure du serveur de base de données

    • Si vous avez votre serveur Web sur un serveur (ou plusieurs) et votre serveur de base de données sur un autre serveur, je vous recommande fortement de synchroniser leurs horloges avec NTP.

    • OU, ne vous fiez qu'à un seul serveur pour vous dire l'heure qu'il est. Habituellement, le serveur de base de données est le meilleur pour demander du temps. En d'autres termes, évitez les codes tels que :

    readyStatement =connection.prepareStatement("UPDATE my_table SET my_time =? WHERE [...]");
    java.util.Date now =new java.util.Date(); // heure locale! :-(
    preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
    int result =prepareStatement.execute();

    • Fiez-vous plutôt à l'heure du serveur de base de données :

    prepareStatement =connection.prepareStatement("UPDATE my_table SET my_time =NOW() WHERE [...]");
    int result =prepareStatement.execute();

J'espère que cela t'aides! :-)