Sztuczka polega na tym, aby wiedzieć, jaki typ kolumny date_last_active
jest. Mam wystarczające doświadczenie z TIMESTAMP
i DATETIME
aby wiedzieć, że jedna z nich tłumaczy (i honoruje) zmienną sesji MySQL time_zone, druga nie.
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)
Oto co robię:
- Podczas wstawiania do bazy danych użyj UTC w PHP i MySQL. W
my.cnf
Mam:time_zone=UTC
aby uniknąć problemów w MySQL i PHP Idate_default_timezone_set('UTC')
. - Użyj
UTC_TIMESTAMP()
zamiastNOW()
- jeden to UTC, drugi używa lokalnej (sesyjnej) strefy czasowej. Jeśli podążasz za pierwszym punktem powyżej, użyj UTC_TIMESTAMP(). - Wybierając wyświetlanie użytkownikowi,
set time_zone='
local_time_zone'
przed wyświetleniem czegokolwiek. - Jeśli musisz wyświetlać rzeczy, a następnie zaktualizuj, upewnij się, że Twoje wywołania są w nawiasie z odpowiednimi zmianami strefy czasowej w PHP i MySQL.
Mam nadzieję, że to wystarczy, aby dowiedzieć się, jak do tego podejść. Daj mi znać, jeśli masz dodatkowe pytania.