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

Avoir des problèmes de fuseau horaire avec PHP et MySQL

L'astuce ici est de savoir quel type de colonne date_last_active est. J'ai assez d'expérience avec TIMESTAMP et DATETIME savoir que l'un traduit (et respecte) la variable de session MySQL time_zone, l'autre non.

mysql> SET SESSION time_zone = 'America/New_York';
Query OK, 0 rows affected (0.00 sec)

mysql> create table timetest ( dt datetime NULL, ts timestamp NOT NULL DEFAULT 0 );
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO timetest ( dt, ts ) VALUES ( UTC_TIMESTAMP(), UTC_TIMESTAMP() );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO timetest ( dt, ts ) VALUES ( NOW(), NOW() );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM timetest;
+---------------------+---------------------+
| dt                  | ts                  |
+---------------------+---------------------+
| 2009-06-27 17:53:51 | 2009-06-27 17:53:51 | 
| 2009-06-27 13:53:54 | 2009-06-27 13:53:54 | 
+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql> set session time_zone='UTC';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM timetest;
+---------------------+---------------------+
| dt                  | ts                  |
+---------------------+---------------------+
| 2009-06-27 17:53:51 | 2009-06-27 21:53:51 | 
| 2009-06-27 13:53:54 | 2009-06-27 17:53:54 | 
+---------------------+---------------------+
2 rows in set (0.00 sec)

Alors, voici ce que je fais :

  • Lors de l'insertion dans la base de données, utilisez UTC dans PHP et dans MySQL. Dans my.cnf J'ai :time_zone=UTC pour éviter tout problème dans MySQL, et dans PHP I date_default_timezone_set('UTC') .
  • Utilisez UTC_TIMESTAMP() au lieu de NOW() - l'un est UTC, l'autre utilise le fuseau horaire local (session). Si vous suivez le premier point ci-dessus, utilisez UTC_TIMESTAMP().
  • Lorsque vous sélectionnez l'affichage pour l'utilisateur, set time_zone=' local_time_zone ' avant d'afficher quoi que ce soit.
  • Si vous devez afficher des éléments, puis mettez à jour, assurez-vous de mettre vos appels entre parenthèses avec les changements de fuseau horaire appropriés dans PHP et MySQL.

J'espère que c'est suffisant pour comprendre comment aborder cela. N'hésitez pas à me contacter si vous avez d'autres questions.