Triknya di sini adalah untuk mengetahui jenis kolom apa date_last_active
adalah. Saya sudah cukup berpengalaman dengan TIMESTAMP
dan DATETIME
untuk mengetahui bahwa yang satu menerjemahkan (dan menghormati) variabel sesi zona waktu MySQL, yang lain tidak.
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)
Jadi, inilah yang saya lakukan:
- Saat memasukkan ke database, gunakan UTC di PHP dan di MySQL. Di
my.cnf
Saya memiliki:time_zone=UTC
untuk menghindari masalah apa pun di MySQL, dan di PHP sayadate_default_timezone_set('UTC')
. - Gunakan
UTC_TIMESTAMP()
bukannyaNOW()
- satu adalah UTC, satu menggunakan zona waktu lokal (sesi). Jika Anda mengikuti poin pertama di atas, gunakan UTC_TIMESTAMP(). - Saat memilih untuk ditampilkan kepada pengguna,
set time_zone='
zona_waktu_lokal'
sebelum menampilkan apa pun. - Jika Anda harus menampilkan sesuatu, lalu perbarui, pastikan untuk mengelompokkan panggilan Anda dengan perubahan zona waktu yang sesuai di PHP dan MySQL.
Semoga itu cukup untuk mengetahui cara mendekati ini. Beri tahu saya jika Anda memiliki pertanyaan lebih lanjut.