Fungsi gmmktime() Pada PHP

Di dalam bahasa pemrograman PHP, pengelolaan tanggal dan waktu adalah hal yang sangat umum dilakukan. Bagi pemula, fungsi mktime() mungkin sudah sering terdengar, karena fungsi tersebut memudahkan kita untuk mendapatkan Unix timestamp berdasarkan jam, menit, detik, tanggal, bulan, dan tahun yang kita tentukan. Namun, ada satu fungsi lain yang mirip tetapi bekerja dengan zona waktu GMT (Greenwich Mean Time) atau UTC (Coordinated Universal Time), yaitu gmmktime().

Artikel ini akan membahas apa itu gmmktime(), bagaimana cara menggunakannya, dan perbedaannya dengan mktime(). Kita juga akan melihat beberapa contoh penggunaan dalam berbagai situasi. Gaya pembahasan akan kita buat semi-santai, agar kamu bisa lebih santai membaca tanpa mengorbankan kejelasan. Semoga artikel panjang ini bisa memberikan gambaran menyeluruh dan mendalam tentang fungsi gmmktime() serta hal-hal yang perlu diperhatikan dalam penerapannya.

Apa Itu gmmktime()?

gmmktime() adalah fungsi bawaan PHP yang berfungsi untuk menghasilkan nilai Unix timestamp (jumlah detik sejak 1 Januari 1970 00:00:00 UTC) berdasarkan parameter-parameter yang menggambarkan tahun, bulan, hari, jam, menit, dan detik. Fungsi ini sangat mirip dengan mktime(). Bedanya, mktime() menggunakan (atau dipengaruhi oleh) zona waktu lokal yang telah diatur di server, sedangkan gmmktime() selalu menghitung waktu seolah-olah berada pada zona waktu GMT/UTC.

Istilah GMT (Greenwich Mean Time) sering digunakan bergantian dengan UTC, terutama dalam konteks pemrograman sehari-hari. Meskipun secara teknis ada sedikit perbedaan pada definisi ilmiah, keduanya sama-sama menunjukkan patokan waktu universal. Karena itu, ketika kita berbicara tentang gmmktime() yang menggunakan GMT, dapat diartikan juga bahwa waktu yang dihitung adalah UTC.

Perbandingan mktime() dan gmmktime()

Agar lebih jelas, mari kita lihat perbandingan mktime() dan gmmktime() secara singkat:

  1. Zona Waktu:
    • mktime() mempertimbangkan zona waktu yang sudah diatur di server (atau di kode program melalui date_default_timezone_set()).
    • gmmktime() selalu menghitung waktu berdasarkan UTC, tanpa menghiraukan time zone setempat.
  2. Penyesuaian DST (Daylight Saving Time):
    • mktime() dapat terpengaruh oleh DST jika server menyesuaikan jam secara otomatis.
    • gmmktime() tidak peduli DST karena selalu menghitung berdasarkan waktu standar UTC.
  3. Penerapan:
    • mktime() cocok ketika kita ingin menggunakan waktu sesuai zona yang sudah diatur, misalnya zona lokal tertentu.
    • gmmktime() sangat cocok untuk aplikasi yang menuntut konsistensi lintas zona waktu, seperti logging atau penentuan tanggal di basis data yang bersifat global.

Sederhananya, jika mktime() menghasilkan timestamp versi lokal, maka gmmktime() menghasilkan timestamp versi global (UTC). Meski demikian, struktur parameternya tetap sama.

Struktur Parameter gmmktime()

gmmktime() pada dasarnya menerima parameter dengan urutan yang sama seperti mktime():

  1. hour (Jam, angka bulat dari 0–23)
  2. minute (Menit, angka bulat dari 0–59)
  3. second (Detik, angka bulat dari 0–59)
  4. month (Bulan, angka bulat dari 1–12)
  5. day (Tanggal, angka bulat dari 1–31)
  6. year (Tahun, angka empat digit, misalnya 2025)
  7. is_dst (opsional, penyesuaian DST). Namun untuk gmmktime(), parameter ini tidak terlalu relevan karena DST tidak berlaku di UTC.

Secara umum, format pemanggilannya adalah:


<?php
$timestamp = gmmktime(hour, minute, second, month, day, year);
?>

Sama seperti mktime(), beberapa parameter hour, minute, second, month, atau day dapat diisi dengan nilai melebihi batasnya. Misalnya, jika kita memasukkan 70 untuk minute, maka PHP akan menghitung sisanya ke jam berikutnya. Hal ini memudahkan perhitungan tanggal karena kita tidak perlu repot melakukan validasi manual.

Contoh Dasar Penggunaan gmmktime()

Mari kita mulai dengan contoh sederhana. Kita mau mendapatkan timestamp untuk tanggal 1 Januari 2025, pukul 00:00:00 UTC. Kode berikut bisa digunakan:


<?php
$timestamp = gmmktime(0, 0, 0, 1, 1, 2025);
echo $timestamp;
?>

Hasilnya akan berupa angka besar yang merepresentasikan jumlah detik sejak 1 Januari 1970, jam 00:00:00 UTC, sampai dengan 1 Januari 2025, jam 00:00:00 UTC. Angka ini bisa berbeda tergantung kapan kamu menjalankannya—bukan dalam hal perhitungan, melainkan dari sisi interpretasi jika kita sedang memeriksanya dengan fungsi-fungsi lain.

Menampilkan Tanggal Berdasarkan gmmktime()

Menghasilkan timestamp saja terkadang kurang berguna jika kita mau menampilkannya secara human-readable. Biasanya, timestamp tersebut akan kita kombinasikan dengan fungsi gmdate() (atau date() jika kita ingin tampilan lokal). Berikut contoh bagaimana kita bisa memformat timestamp yang dihasilkan oleh gmmktime():


<?php
$timestamp = gmmktime(0, 0, 0, 2, 28, 2025); // 28 Februari 2025, pukul 00:00:00 UTC
$formattedDate = gmdate("Y-m-d H:i:s", $timestamp);

echo "Tanggal UTC (gg-mm-tt jj:mm:dd): " . $formattedDate;
// Output contoh: Tanggal UTC (gg-mm-tt jj:mm:dd): 2025-02-28 00:00:00
?>

Dengan cara ini, kita bisa mencetak string tanggal yang sudah rapi. Perhatikan bahwa kita menggunakan gmdate(), bukan date(), agar format yang dihasilkan konsisten dengan asumsi UTC.

Penggunaan gmmktime() untuk Menentukan Tanggal di Masa Depan atau Masa Lalu

Satu kemampuan menarik dari mktime() dan gmmktime() adalah kita bisa memasukkan nilai yang melebihi atau kurang dari ketentuan jam/menit/detik/bulan/tahun, lalu PHP akan otomatis melakukan carry over atau carry backward ke satuan yang lebih besar atau lebih kecil. Kita bisa memanfaatkan hal ini untuk menambahkan atau mengurangi rentang waktu tertentu. Contoh, jika kita ingin mencari timestamp untuk 30 hari setelah 15 Maret 2025, kita bisa memanfaatkan parameter dengan menambahkan 30 hari pada argumen day:


<?php
$timestamp = gmmktime(0, 0, 0, 3, 15 + 30, 2025); // 30 hari setelah 15 Maret 2025
echo gmdate("Y-m-d", $timestamp);
// Output: 2025-04-14 (tergantung validasi tanggal, misalnya 30 hari setelah 15 Maret)
?>

PHP akan otomatis menghitung bahwa jika kita berada di bulan Maret (yang biasanya 31 hari), dan kita menambahkan 30 hari, maka akan masuk ke bulan April. Ini sangat praktis ketimbang kita perlu menghitung manual berapa hari dalam bulan Maret, apakah tahun kabisat, dan sebagainya.

Begitu juga dengan jam, menit, dan detik. Jika misalnya kamu memasukkan 75 menit, maka PHP akan mengkonversi sisanya ke jam. Hal ini membuat fungsi gmmktime() menjadi sangat fleksibel ketika kita perlu melakukan kalkulasi waktu di level UTC.

Contoh Penggunaan dalam Kasus Aplikasi Nyata

1. Timestamp Universal untuk Penyimpanan Database

Ketika kamu membangun aplikasi yang melibatkan banyak pengguna dari berbagai zona waktu, menyimpan semua data dalam format timestamp UTC adalah praktik yang umum dan disarankan. gmmktime() menjadi salah satu opsi ketika kita ingin membentuk sebuah timestamp tertentu. Misalnya, kita punya form input di mana pengguna memasukkan tahun, bulan, dan tanggal sebuah event, lalu kita ingin menyimpannya dalam bentuk timestamp UTC. Kodenya bisa seperti ini:


<?php
// Misalnya user memasukkan data via form
// $_POST['year'] = 2025;
// $_POST['month'] = 12;
// $_POST['day'] = 31;

// Kita asumsikan event berlangsung jam 23:59:59 UTC
$timestamp = gmmktime(23, 59, 59, $_POST['month'], $_POST['day'], $_POST['year']);

// Kemudian timestamp ini kita simpan ke database
// Contoh: INSERT INTO events (event_timestamp) VALUES ($timestamp);

// Nanti saat menampilkan, kita bisa melakukan penyesuaian ke zona waktu lokal pengguna.
echo "Event timestamp (UTC): " . $timestamp;
?>

Dengan cara ini, semua data event yang disimpan bisa dibandingkan tanpa pusing memikirkan konversi antar zona waktu. Proses penyesuaian ke zona waktu lokal bisa dilakukan ketika menampilkan data, bukan saat penyimpanan.

2. Menghitung Selisih Hari atau Bulan secara Konsisten

Terkadang kita perlu menghitung rentang waktu secara akurat, misalnya menentukan berapa hari lagi sampai jatuh tempo tertentu. Dengan gmmktime(), kita bisa mengatur semuanya dalam UTC sehingga bebas dari pengaruh Daylight Saving Time atau perbedaan regional. Contoh:


<?php
// Katakan kita ingin mengetahui berapa hari dari hari ini (UTC) hingga 15 Mei 2025.
// Pertama, dapatkan timestamp untuk hari ini (UTC).
$todayUTC = gmmktime(0, 0, 0, gmdate("n"), gmdate("j"), gmdate("Y"));

// Kemudian, dapatkan timestamp untuk tanggal 15 Mei 2025 (UTC).
$targetTimestamp = gmmktime(0, 0, 0, 5, 15, 2025);

// Hitung selisih dalam satuan detik
$diffSeconds = $targetTimestamp - $todayUTC;

// Ubah ke satuan hari (1 hari = 86400 detik)
$diffDays = floor($diffSeconds / 86400);

echo "Sisa $diffDays hari sampai tanggal 15 Mei 2025 (UTC).";
?>

Dengan melakukan semua perhitungan di UTC, kita menghindari situasi ambigu seperti pergeseran satu jam (DST) atau perbedaan jam server. Hasilnya tetap konsisten.

3. Menghasilkan Waktu Expiry untuk Cookie atau Token

Ketika kita membuat sistem auth token, session, atau cookie, sering kali kita perlu menentukan kapan token tersebut kadaluarsa. Dalam kasus ini, kita dapat menggunakan gmmktime() untuk membuat timestamp kadaluarsa berdasarkan waktu UTC. Misalnya, kita mau token berlaku 24 jam sejak sekarang:


<?php
$expiry = gmmktime(gmdate("H"), gmdate("i"), gmdate("s") + 86400, gmdate("n"), gmdate("j"), gmdate("Y"));
// gmmktime(hour, minute, second, month, day, year)
// Di sini, second kita tambahkan 86400 detik (1 hari)

echo "Token akan kadaluarsa pada: " . gmdate("Y-m-d H:i:s", $expiry) . " UTC";
?>

Dengan cara di atas, kita membuat token expiry yang tidak terpengaruh oleh pengaturan zona waktu server. Saat divalidasi di mana pun, kita selalu mengecek token expiry terhadap waktu UTC yang sama.

Mengapa Menggunakan gmmktime() untuk Aplikasi Lintas Zona?

Dalam lingkungan pengembangan modern, kita sering dihadapkan pada situasi lintas zona waktu. Misalnya, pengguna bisa datang dari berbagai negara, atau aplikasi kita berjalan di beberapa server yang lokasinya berbeda-beda. Menangani waktu di konteks semacam itu bisa jadi memusingkan apabila kita tidak menetapkan standar bersama.

gmmktime() menyediakan solusi untuk membentuk timestamp yang selalu konsisten dengan UTC. Beberapa manfaatnya:

Perhatian tentang DST dan time zone Lain

Meskipun gmmktime() tidak terpengaruh DST, kita tetap perlu hati-hati kalau suatu saat kita melakukan konversi ke zona waktu yang menerapkan DST. Misalnya, kita punya timestamp hasil gmmktime(), lalu kita ingin menampilkannya di zona waktu tertentu menggunakan date(). Bila zona tersebut menerapkan DST, date() akan menyesuaikan tampilan. Pastikan kita memahami bahwa di level penyimpanan atau pemrosesan di UTC, kita selalu bebas dari DST. Namun, saat menampilkan di zona lain, DST mungkin saja berlaku.

Hal ini bukan berarti gmmktime() salah, justru inilah keunggulannya: kita bisa menjaga agar semua perhitungan inti tetap di UTC, kemudian menyesuaikan tampilan akhir sesuai zona pengguna.

Beberapa Tips dan Trik

1. Gunakan strtotime() Jika Ingin Kemudahan Parsing String

Bila kita sering berurusan dengan format string seperti "2025-02-27 10:00:00", kita mungkin lebih nyaman menggunakan strtotime() untuk mengubah string tersebut ke timestamp UTC. Caranya, kombinasikan dengan gmdate() jika perlu menampilkan, atau cermati pengaturan default time zone. Namun, untuk kasus spesifik dan terstruktur, gmmktime() lebih tepat karena kita secara eksplisit menyebutkan jam, menit, detik, tanggal, bulan, dan tahun.

2. Perhatikan Nilai Overflow

Walaupun gmmktime() mendukung overflow (misalnya menambahkan 30 hari pada day), pastikan logika perhitunganmu tepat. Jika kamu bermain dengan angka yang sangat besar (misalnya ribuan tahun ke depan atau ke belakang), mungkin akan ada batasan integer pada sistem 32-bit. Pada sistem 64-bit, jarak waktunya bisa lebih panjang.

3. Cocok untuk Aplikasi Penjadwalan

Bagi kamu yang sedang membuat sistem penjadwalan (misalnya cron job di aplikasi, penentuan deadline, atau jadwal webinar lintas negara), gmmktime() bisa menjadi solusi. Kita bisa menetapkan jadwal-jadwal kunci dalam format UTC, lalu menyesuaikannya ke zona waktu lokal peserta jika diperlukan. Ini meniadakan kebingungan saat menangani DST atau perubahan jam di berbagai wilayah.

Bagaimana Jika Kita Sudah Menggunakan mktime()?

Jika aplikasi lamamu sudah terlanjur banyak memakai mktime(), tidak ada masalah. Namun, pastikan bahwa kamu memahami dampak zona waktu terhadap data yang dihasilkan. Jika server kamu ternyata berada di zona yang berbeda, data timestamp mungkin akan berbeda pula. Solusinya, kamu bisa memaksa zona waktu server ke UTC dengan date_default_timezone_set("UTC"), sehingga mktime() pun berperilaku mirip gmmktime().

Namun, jika preferensimu adalah memiliki perhitungan waktu yang selalu bebas dari pengaturan php.ini atau date_default_timezone_set(), maka gmmktime() adalah pilihan yang lebih aman karena secara eksplisit menegaskan penggunaan waktu UTC.

Catatan Penting

gmmktime() adalah fungsi yang mirip dengan mktime(), tetapi selalu menggunakan acuan waktu universal (UTC). Dengan demikian, fungsi ini sangat berguna dalam situasi di mana kita ingin menjaga konsistensi lintas zona waktu, termasuk menghindari kerancuan akibat DST.

  1. Struktur Parameter Mirip mktime(): Semua argumen (jam, menit, detik, bulan, hari, dan tahun) berlaku sama. Perbedaannya hanya pada zona waktu yang digunakan.
  2. Bebas dari Pengaruh Time Zone Lokal: gmmktime() tidak akan terpengaruh oleh date_default_timezone_set(), jadi lebih konsisten untuk aplikasi global.
  3. Mudah Digabung dengan gmdate(): Jika ingin menampilkan hasil timestamp secara rapi dalam UTC, kita bisa langsung gunakan gmdate(). Kalaupun perlu zona waktu lokal, kita cukup mengonversinya.
  4. Ideal untuk Penjadwalan & Penyimpanan: Menyimpan timestamp dalam UTC adalah praktik umum dalam aplikasi global karena memudahkan perbandingan waktu antar region.
  5. Perhatikan Batasan Sistem: Pada sistem 32-bit, jangkauan tahun yang dapat dihasilkan timestamp akan terbatas, sedangkan pada sistem 64-bit lebih luas. Pastikan cek versi PHP dan OS yang digunakan.

Dengan memperhatikan poin-poin di atas, kamu bisa menerapkan gmmktime() secara tepat di berbagai proyek, terutama ketika proyekmu memerlukan pendekatan waktu yang netral, universal, dan dapat diandalkan untuk analisis maupun penjadwalan. Semoga pembahasan panjang lebar ini membantu!


Baca Juga :