Номерът тук е да знаете какъв тип колона date_last_active
е Имам достатъчно опит с TIMESTAMP
и DATETIME
за да знаете, че единият превежда (и зачита) променливата на сесията time_zone на MySQL, а другият не.
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)
И така, ето какво правя:
- Когато вмъквате в базата данни, използвайте UTC в PHP и в MySQL. В
my.cnf
Имам:time_zone=UTC
за да избегнем проблеми в MySQL, а в PHP Idate_default_timezone_set('UTC')
. - Използвайте
UTC_TIMESTAMP()
вместоNOW()
- единият е UTC, един използва местната (сесия) часова зона. Ако следвате първата точка по-горе, използвайте UTC_TIMESTAMP(). - Когато избирате да се показва на потребителя,
set time_zone='
местна_часова_зона'
преди да покажете нещо. - Ако трябва да покажете неща, след това актуализирайте, уверете се, че сте поставили в скоби обажданията си с подходящите промени в часовата зона в PHP и MySQL.
Надяваме се, че това е достатъчно, за да разберете как да подходите към това. Кажете ми, ако имате допълнителни въпроси.