Server yang jamnya melenceng menghasilkan galat yang tampak seperti apa saja kecuali jam: sertifikat yang "belum berlaku", masuk yang gagal padahal kata sandinya benar, tugas terjadwal di jam yang keliru. Layak disingkirkan sejak awal, karena ongkosnya cuma satu perintah.

timedatectl

Nyalakan penyelarasannya

timedatectl set-ntp true
timedatectl show -p NTPSynchronized --value

Tiga jam, tiga pengaturan

  • Sistemnya - biarkan di UTC. Dengan begitu setiap catatan dan setiap cap waktu yang tersimpan tak menimbulkan kesamaran.
  • PHP - date.timezone, yang memengaruhi apa yang dicetak date() dan tidak lebih dari itu.
  • MySQL - punya time_zone-nya sendiri, yang memengaruhi NOW() dan CURRENT_TIMESTAMP.
date
php -r 'echo date("Y-m-d H:i:s T"), PHP_EOL;'
mysql -e "SELECT NOW(), @@global.time_zone, @@session.time_zone;"
Kalau PHP menulis cap waktu dalam waktu setempat sementara MySQL menyimpannya dalam UTC, setiap perbandingan meleset sebesar selisih itu - dan baru dua kali setahun, ketika selisihnya berubah, ada yang menyadarinya. Simpan dalam UTC, ubah saat menampilkan.

Apa yang rusak ketika jamnya meleset

  • TLS. Sertifikat yang berlaku mulai besok ditolak hari ini. Galat perambannya menyebut sertifikatnya, bukan jamnya.
  • Token dan dua faktor. Kode TOTP diturunkan dari waktu; meleset lebih dari tiga puluh detik dan semua kodenya jadi salah.
  • Tugas terjadwal. Pekerjaannya jalan di jam yang salah, atau dua kali, atau sama sekali tidak jalan saat melintasi sebuah perubahan.
  • Menyandingkan catatan. Dua server yang terpaut beberapa menit sama sekali tak bisa dibaca bersamaan.
Setel sistemnya ke UTC dan jangan pernah diubah. Tampilkan waktu setempat kepada orang pada saat paling akhir yang mungkin - di peramban, dari jam mereka sendiri.