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.cnf
Jeg har:time_zone=UTC
for 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.