Tricket her er at vide, hvilken kolonnetype date_last_active er. Jeg har haft nok erfaring med TIMESTAMP og DATETIME at vide, at den ene oversætter (og respekterer) sessionsvariablen MySQL time_zone, den anden gør det ikke.
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)
Så her er hvad jeg gør:
- Når du indsætter i databasen, skal du bruge UTC i PHP og i MySQL. I
my.cnfJeg har:time_zone=UTCfor at undgå problemer i MySQL og i PHP Idate_default_timezone_set('UTC'). - Brug
UTC_TIMESTAMP()i stedet forNOW()- en er UTC, en bruger den lokale (session) tidszone. Hvis du følger det første punkt ovenfor, skal du bruge UTC_TIMESTAMP(). - Når du vælger at vise til brugeren,
set time_zone='lokal_tidszone'før du viser noget. - Hvis du skal vise ting, så opdater, sørg for at sætte dine opkald i parentes med de relevante tidszoneændringer i PHP og MySQL.
Forhåbentlig er det nok til at finde ud af, hvordan man griber dette an. Sig til, hvis du har yderligere spørgsmål.