Mẹo ở đây là biết loại cột nào date_last_active
Là. Tôi đã có đủ kinh nghiệm với TIMESTAMP
và DATETIME
để biết rằng một biến dịch (và tôn vinh) biến phiên múi giờ của MySQL, biến còn lại thì không.
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)
Vì vậy, đây là những gì tôi làm:
- Khi chèn vào cơ sở dữ liệu, hãy sử dụng UTC trong PHP và trong MySQL. Trong
my.cnf
Tôi có:time_zone=UTC
để tránh bất kỳ sự cố nào trong MySQL và trong PHP, tôidate_default_timezone_set('UTC')
. - Sử dụng
UTC_TIMESTAMP()
thay vìNOW()
- một là UTC, một sử dụng múi giờ địa phương (phiên). Nếu bạn đang theo dõi điểm đầu tiên ở trên, hãy sử dụng UTC_TIMESTAMP (). - Khi chọn hiển thị cho người dùng, hãy
set time_zone='
local_time_zone'
trước khi hiển thị bất cứ thứ gì. - Nếu bạn phải hiển thị nội dung, sau đó cập nhật, hãy đảm bảo phân bổ các cuộc gọi của bạn với các thay đổi múi giờ thích hợp trong PHP và MySQL.
Hy vọng rằng đó là đủ để tìm ra cách tiếp cận điều này. Hãy cho tôi biết nếu bạn có thêm câu hỏi.