Menyesuaikan Zona Waktu di MySQL dan PHP

Ketika membuat sebuah aplikasi website, seringkali waktu yang ditunjukkan oleh server tidak sama dengan waktu client. Ini terjadi karena server terletak di zona waktu yang berbeda dengan client. Misalnya server yang berlokasi di USA, jelas berada di zona waktu yang berbeda dengan client di Indonesia.

echo date('d-m-Y H:i:s');

Kode PHP di atas akan menampilkan waktu aktual pada server. Jika dicoba di localhost tentu saja waktunya akan sama seperti komputer lokal, namun hasilnya bisa berbeda jika dicoba pada server web Anda. Agar hasilnya sesuai dengan waktu di komputer kita, tambahkan pengaturan zona waktu.

date_default_timezone_set('Asia/Jakarta');
echo date('d-m-Y H:i:s');

Untuk zona waktu yang lain bisa menyesuaikan.

Namun cara di atas memiliki beberapa kelemahan, terutama pada aplikasi yang menggunakan database. Selain kemungkinan terkena bug Y2K38, MySQL dan PHP memiliki pengaturan zona waktu yang terpisah. Misal kita menjalankan fungsi NOW() pada MySQL, waktu yang ditampilkan tidak sesuai dengan zona waktu kita. Selain itu, aplikasi juga membutuhkan tambahan proses setiap kali mengolah data dari field waktu pada MySQL agar sesuai dengan zona waktu kita.

Agar proses penyesuaian waktu bisa berjalan secara otomatis, kita harus mengetahui berapa selisih waktu client dengan UTC, kemudian beritahukan kepada MySQL. Pertama-tama dengan bantuan class Datetime, kita dapatkan offset (untuk menutupi selisih yang ada) dalam detik, kemudian mudah saja kita konversikan ke dalam menit dan jam.

$sekarang = new DateTime();
$menit = $sekarang -> getOffset() / 60;

Kemudian cari tau apakah offset bernilai positif atau negatif, lalu konversikan saja ke bilangan positif untuk memudahkan penghitungan.

$tanda = ($menit < 0 ? -1 : 1);
$menit = abs($menit);
$jam = floor($menit / 60);
$menit -= $jam * 60;

Gunakan fungsi sprintf untuk memformat string agar bisa diterima MySQL (format yang bisa diterima misalnya: +07:00).

$offset = sprintf('%+d:%02d', $tanda * $jam, $menit);

Terakhir jalankan query SET time_zone setelah mengkoneksikan aplikasi dengan database. Silakan ganti dengan koneksi database yang Anda gunakan.

mysql_connect($server, $username, $password);
mysql_select_db($database);

mysql_query("SET time_zone = '$offset'");

Akhirnya pengaturan zona waktu antara PHP dan MySQL telah sesuai. Berikut ini adalah gabungan kode-kode snippet di atas.

<?php
date_default_timezone_set('Asia/Jakarta');

$sekarang = new DateTime();
$menit = $sekarang -> getOffset() / 60;

$tanda = ($menit < 0 ? -1 : 1);
$menit = abs($menit);
$jam = floor($menit / 60);
$menit -= $jam * 60;

$offset = sprintf('%+d:%02d', $tanda * $jam, $menit);

mysql_connect($server, $username, $password);
mysql_select_db($database);

mysql_query("SET time_zone = '$offset'");

About Sibudi

Ubuntu user | Loves books | Blogger | Web Developer | Learn PHP, JavaScript, Ruby & Python the hard way

13. July 2012 by Sibudi
Categories: PHP | Tags: , , | 27 comments

Comments (27)

  1. Pingback: Akses Database Menggunakan PDO pada PHP | Sibudi </>

  2. maaf mas script ny d taruh d mana??
    apa d taruh d atas .httaccess??

    • Bukan di .htaccess ya, ini script PHP.
      Ditaruh di bagian paling atas setiap script php yang membutuhkan waktu. Atau bisa menggunakan file terpisah dan tinggal di-include setiap kali dibutuhkan.

  3. Masih bingung mas..saya coba di web ga jadi.

  4. Keep Posting ! Good

  5. wow…
    akhirnya….
    sinkron juga waktunya
    terima kasih nih sharenya

  6. Mas, mohon bantuannya untuk validasi waktu dengan memanfaatkan fungsi-fungsi diatas.

    Saya punya tabel MySql “abc”, diantaranya berisi kolom “batas_waktu” dengan TYPE: Time, yang akan dijadikan validator.
    Contoh record : “13:30:00”
    Saya membutuhkan validasi dengan kondisi:
    jika “waktu saat ini” > “batas_waktu”
    maka “hasilnya”.

    Mohon bantuannya.. terima ksih

  7. akhirnya 😀 ..
    lanjut berbagi bro 😀

  8. makasih mas akhirnya sinkron juga waktunya

  9. Thank you mas. sangat berguna sekali. Yuhu.

  10. thanks mas. waktunya udah sama

  11. Great!!!! Thanks a lot brother!!! It’s work like a charm 😀

  12. Bermanfaat sekali postinganya mas…..

  13. mas knapa ya klau saya pke curtime waktunya kok -12 jam dari waktu asli? mohon bantuannya!

  14. Nah ini dia dari kmrn ubek2 om google gk nemu2 stuck, maklum programer otodidak..
    Thanks master suhu.
    Klo bole req donk cara multi query .thanks

  15. Mas saya punya tabel antrian, nah nanti orang di tabel antrian tersebut akan di sms nomor antrian dan estimasi waktunya di, itu bagaimana ya mas pertambahan waktunya?

  16. Mas saya punya tabel antrian, nah nanti orang di tabel antrian tersebut akan di sms nomor antrian dan estimasi waktunya di, itu bagaimana ya mas pertambahan waktunya?

    Tolong bantu yah mas

  17. makasih bro bermanfaat waktu udah berubah nih di web ane http://virtual.pe.hu/

  18. wkwkwkw makasih gan , sudah saya terapkan scripnya dan berhasil, emank susah kalo mau ambil jam:menit:detik kalau dari server, jika tidak menggunkan fungsi date_default_timezone_set(‘Asia/Jakarta’);
    jam:menit:detik akan sembarang masuk di database, thx

  19. Mantap Gan, … Thanks gan dah bantu kerjaan sy…

  20. thanks for the solution

  21. saya menggunakan mysql untuk database kippo graph honeypot. saya punya masalah pada “end date (last attack)” pada visualization, ketika saya menyerang honeypot yang telah saya buat untuk di coba pada waktu 11.32 AM tapi laporan yang saya terima adalah waktu 05.32 AM. bagaimana cara saya memperbaiki masalah tersebut ?
    terima kasih…

  22. omg thanks berat

  23. saya sudah coba masi tapi masih gagal

  24. Segera bergabung di Hashtag Option. Platform Trading Forex pertama di Indonesia,
    Trading binary option berbasis Indonesia dengan payout hingga 85%, minimal depo 50.000,-

    Dapatkan bonus depo pertama 10%** T&C Applied…
    Anda juga mendapatkan BONUS Referral 1% dari rofit investasi tanpa turnover….

    Hayooo daftar sekarang juga. kunjungi website kami di http://www.hashtagoption.com.
    Salam Profit

  25. kalau di implementasi di codeigniter gimana ya gan? bingung

Leave a Reply to rino Cancel reply

Required fields are marked *