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:
-
Zona Waktu:
mktime()
mempertimbangkan zona waktu yang sudah diatur di server (atau di kode program melaluidate_default_timezone_set()
).gmmktime()
selalu menghitung waktu berdasarkan UTC, tanpa menghiraukan time zone setempat.
-
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.
-
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()
:
- hour (Jam, angka bulat dari 0–23)
- minute (Menit, angka bulat dari 0–59)
- second (Detik, angka bulat dari 0–59)
- month (Bulan, angka bulat dari 1–12)
- day (Tanggal, angka bulat dari 1–31)
- year (Tahun, angka empat digit, misalnya 2025)
- 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:
- Keseragaman: Semua proses pembuatan timestamp dilakukan di satu zona waktu universal, sehingga tidak timbul kebingungan akibat perbedaan zona waktu.
- Konsistensi DST: UTC tidak menerapkan DST. Bagi sistem yang memerlukan ketepatan di level global, ini memudahkan analisis dan audit.
- Keterbacaan Cross-Server: Jika aplikasi kita berjalan pada multi-server, maka timestamp di log atau database bisa diselaraskan dengan mudah.
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.
-
Struktur Parameter Mirip
mktime()
: Semua argumen (jam, menit, detik, bulan, hari, dan tahun) berlaku sama. Perbedaannya hanya pada zona waktu yang digunakan. -
Bebas dari Pengaruh Time Zone Lokal:
gmmktime()
tidak akan terpengaruh olehdate_default_timezone_set()
, jadi lebih konsisten untuk aplikasi global. -
Mudah Digabung dengan
gmdate()
: Jika ingin menampilkan hasil timestamp secara rapi dalam UTC, kita bisa langsung gunakangmdate()
. Kalaupun perlu zona waktu lokal, kita cukup mengonversinya. - Ideal untuk Penjadwalan & Penyimpanan: Menyimpan timestamp dalam UTC adalah praktik umum dalam aplikasi global karena memudahkan perbandingan waktu antar region.
- 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 :