Tricket här är att veta vilken kolumntyp date_last_active är. Jag har haft tillräckligt med erfarenhet av TIMESTAMP och DATETIME att veta att den ena översätter (och respekterar) sessionsvariabeln MySQL time_zone, den andra gör det inte.
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å här är vad jag gör:
- När du infogar i databasen, använd UTC i PHP och MySQL. I
my.cnfJag har:time_zone=UTCför att undvika problem i MySQL och i PHP Idate_default_timezone_set('UTC'). - Använd
UTC_TIMESTAMP()istället förNOW()- en är UTC, en använder den lokala (sessions) tidszonen. Om du följer den första punkten ovan, använd UTC_TIMESTAMP(). - När du väljer att visa för användaren,
set time_zone='local_time_zone'innan du visar något. - Om du måste visa grejer och sedan uppdatera, se till att du har rätt tidszonsändringar i PHP och MySQL.
Förhoppningsvis räcker det för att ta reda på hur man ska ta sig an detta. Meddela mig om du har fler frågor.