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 Idate_default_timezone_set('UTC')
. - Utilisez
UTC_TIMESTAMP()
au lieu deNOW()
- 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.