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'");

Comments

27 responses to “Menyesuaikan Zona Waktu di MySQL dan PHP”

  1. […] pada PHP versi 5.5. Itu artinya, penggunaan fungsi mysql_connect() atau mysql_query(), seperti pada postingan yang lalu, harus diganti. Pilihannya adalah menggunakan Mysqli Extensions atau yang akan dibahas berikut ini, […]

  2. alundra00 Avatar
    alundra00

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

    1. Sibudi Avatar

      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. sgiant Avatar

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

  4. Oriza Avatar

    Keep Posting ! Good

  5. panggeh Avatar
    panggeh

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

  6. Hady Avatar
    Hady

    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. Mantap Avatar

    akhirnya 😀 ..
    lanjut berbagi bro 😀

  8. edward Avatar
    edward

    makasih mas akhirnya sinkron juga waktunya

  9. Fuddychoi Avatar
    Fuddychoi

    Thank you mas. sangat berguna sekali. Yuhu.

  10. Ahmad sopian Avatar
    Ahmad sopian

    thanks mas. waktunya udah sama

  11. Hafidz I B Avatar

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

  12. Disarada Avatar

    Bermanfaat sekali postinganya mas…..

  13. andar Avatar
    andar

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

  14. budi Avatar

    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. Tiara Avatar
    Tiara

    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. Tiara Avatar
    Tiara

    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. rino Avatar

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

  18. risky Avatar

    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. Edwin Avatar
    Edwin

    Mantap Gan, … Thanks gan dah bantu kerjaan sy…

  20. Arman Avatar
    Arman

    thanks for the solution

  21. Bobi Avatar
    Bobi

    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. thrombohope Avatar
    thrombohope

    omg thanks berat

  23. arman Avatar
    arman

    saya sudah coba masi tapi masih gagal

  24. Hahstag Option Avatar

    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. Rendi Avatar
    Rendi

    kalau di implementasi di codeigniter gimana ya gan? bingung

Leave a Reply

Your email address will not be published. Required fields are marked *