Jika Anda membatasi diri Anda pada tipe DATE dan DATETIME MySQL, Anda sebagian besar dapat mengabaikan masalah zona waktu di MySQL itu sendiri. Anda ingin menghindari tipe TIMESTAMP MySQL karena:
Sejauh membaca/menulis nilai DATETIME, Anda akan mendapatkan kembali persis apa yang Anda masukkan, dan itu bagus.
Itu membuat Anda kesulitan untuk selalu memastikan Anda menulis nilai UTC ke database.
Cara terbaik untuk memastikan bahwa PHP menggunakan UTC adalah dengan menyetelnya secara eksplisit di aplikasi Anda menggunakan date_default_timezone_set()
. Itu akan memastikan bahwa panggilan seperti date('Y-m-d H:i:s')
akan memberi Anda nilai UTC. Ini juga akan memastikan bahwa sesuatu seperti (new \DateTime('now'))->getTimezone()
akan mengembalikan contoh \DateTimeZone UTC.
Anda harus mencatat, tentu saja, bahwa segala sesuatunya menjadi jauh lebih sulit ketika Anda menyimpan nilai tanggal/waktu yang Anda ambil dari pengguna. Dalam kasus tersebut, Anda harus entah bagaimana menentukan zona waktu pengguna, dan menangani konversi ke UTC sebelum mempertahankan nilainya. Dengan asumsi pengguna Anda memiliki beberapa pengaturan zona waktu per pengguna, pada dasarnya Anda melakukan sesuatu seperti:
/** @var \DateTimeZone $userTZ */
$userTz = getUserTimezone();
$dateTime = new \DateTime($user_submitted_date_string, $userTz);
$dateTime->setTimezone(new \DateTime('UTC'));
$dateTimeStr = $dateTime->format('Y-m-d H:i:s');