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.cnf
Jag har:time_zone=UTC
fö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.