Memahami Fungsi Time, Strtotime, dan Mktime Pada PHP – Memanipulasi Waktu
Memahami Fungsi Time, Strtotime, dan Mktime Pada PHP – Memanipulasi Waktu
Fungsi
strtotime()
dan mktime()
keduanya memiliki fungsi yang sama yaitu menghasilkan waktu dalam format timestamp. Beda keduanya adalah, pada fungsi strtotime()
, argumen yang diterima adalah string (teks) sedangkan pada fungsi mktime()
, argumen yang digunakan adalah satuan waktu.Pengertian Timestamp
Fungsi yang kita bahas disini semuanya berkaitan dengan timestamp, oleh karena itu, kita perlu tahu apa itu timestamp.
Timestamp adalah istilah yang mengacu pada standar waktu berupa waktu dalam detik sejak epoch time: 1970-01-01 00:00:00, sehingga, angka 1 dalam timestamp berarti 1 detik sejak 1970-01-01 00:00:00 yaitu 1970-01-01 00:00:01, sedangkan 60 berarti 1970-01-01 00:01:00, dst..
Sebagai tambahan, kita juga perlu untuk memahami zona waktu pada PHP: Memahami Zona Waktu (Timezone) dan Selisih Waktu Pada PHP
I. Fungsi Time Pada PHP
Fungsi
time()
digunakan untuk mengambil waktu sekarang pada komputer server dalam format timestamp. Fungsi ini tidak memiliki argumen.
Timestamp yang dihasilkan oleh fungsi
time()
selalu pada waktu UTC (GMT + 0), meskipun konfigurasi zone waktu berubah ubah. Lebih jauh tentang timezone, dapat dibaca pada artikel: Memahami Zona Waktu (Timezone) dan Selisih Waktu Pada PHP
Contoh:
<?php
echo 'Date: ' . date('Y-m-d H:i:s'); // Hasil: 2017-01-17 15:36:12 (GMT + 1)
echo 'Timestamp: ' . time(); // Hasil: 1484663772 (GMT + 0)
date_default_timezone_set('UTC');
echo 'Date: ' . date('Y-m-d H:i:s'); // Hasil: 2017-01-17 14:36:12 (GMT + 0)
echo 'Timestamp: ' . time(); // Hasil: 1484663772 (GMT + 0)
Hasil:
Date: 2017-01-17 15:36:12 Timestamp: 1484663772 Date: 2017-01-17 14:36:12 Timestamp: 1484663772
Pada contoh diatas terlihat bahwa hasil dari fungsi
date()
berubah setelah kita ubah timezone menjadi UTC (GMT + 0), namun timestamp yang dihasilkan fungsi time()
selalu sama yaitu: 1484663772
(GMT + 0).
Fungsi
time()
ini bermanfaat untuk mendapatkan waktu kedepan atau kebelakang sejak waktu saat ini, misal:echo 'Waktu sekarang: ' . date('Y-m-d H:i:s') . '<br/>';
echo '1 menit kedepan: ' . date('Y-m-d H:i:s', time() + 60) . '<br/>';
echo '1 jam kedepan: ' . date('Y-m-d H:i:s', time() + (60 * 60)) . '<br/>';
echo '1 hari kedepan: ' . date('Y-m-d H:i:s', time() + (60 * 60 * 24)) . '<br/>';
echo '7 hari kedepan: ' . date('Y-m-d H:i:s', time() + (60 * 60 * 24 * 7)) . '<br/>';
Hasil:
Waktu sekarang: 2017-01-17 15:48:34 1 menit kedepan: 2017-01-17 15:49:34 1 jam kedepan: 2017-01-17 16:48:34 1 hari kedepan: 2017-01-18 15:48:34 7 hari kedepan: 2017-01-24 15:48:34
Meskipun dapat mengkalkulasi waktu kedepan dan kebelakang, fungsi ini maksimal hanya dapat menghitung waktu dalam detik, tidak bisa menghitung 1 minggu kedepan atau 1 bulan kedepan. Untuk mengatasi hal tersebut, kita dapat menggunakan fungsi
strtotime()
.III. Fungsi Mktime Pada PHP
Fungsi
mktime()
(singkatan: make time) pada PHP juga digunakan untuk mendapatkan waktu tertentu dengan format timestamp. Format penulisannya adalah:mktime(hour, minute, second, month, day, year)
Biasanya, kita membaca argumen dari kiri kekanan. Nah, untuk fungsi
mktime()
agar memudahkan memahami argumen yang digunakan, maka argumen dibaca dari kiri ke kanan (untuk argumen time: H:i:s) dan kanan ke kiri (untuk argumen date: Y-d-m)
Penjelasan argumen:
- Semua argumen bersifat opsional, nilai defaultnya adalah tanggal dan waktu hari ini:
mktime(date('H'), date('i'), date('s'), date('n'), date('j'), date('Y'));
Berikut ini akan menghasilkan nilai yang sama yaitu1484701662
<?php echo strtotime('now'); echo mktime(); echo time();
Ketiganya akan menghasilkan timestamp yang sama, namun, sejak PHP versi 5.1, jika kita menjalankan fungsimktime()
tanpa argumen, akan muncul peringatan agar menggunakan fungsitime()
- Semua argumen berbentuk integer.
- Jika argumen bernilai nol atau negatif, maka menghasilkan waktu sebelumnya, misal:
<?php echo date('d-m-Y', mktime(0,0,0,1,1,2017)); // 01-01-2017 echo date('d-m-Y', mktime(0,0,0,1,0,2017)); // 31-12-2016 echo date('d-m-Y', mktime(0,0,0,1,-1,2017)); // 30-12-2016
- Jika nilai argumen melebihi nilai maksimal, maka akan menghasilkan waktu setelahnya, misal:
<?php echo date('d-m-Y', mktime(0,0,0,1,32,2017)); // 01-02-2017 echo date('d-m-Y', mktime(0,0,0,1,60,2017)); // 01-03-2017 echo date('d-m-Y', mktime(0,0,0,2,29,2017)); // 01-13-2017 echo date('d-m-Y', mktime(0,0,0,13,1,2017)); // 01-01-2018
Jika diperhatikan, fungsi
mktime()
ini mirip dengan fungsi time()
, bedanya, mktime()
lebih fleksibel karena dapat menerima banyak argumen.
Contoh penggunaan fungsi mktime:
<?php
echo date('d-m-Y'); // 18-01-2017
echo date('d-m-Y', mktime( 0, 0, 0, date('n'), date('j') + 30, date('y'))); // 17-02-2017
echo date('d-m-Y', mktime( 0, 0, 0, date('n') - 1, date('j'), date('y'))); // 18-12-2017
III. Fungsi Strtotime Pada PHP
Fungsi
strtotime()
(baca: string to time) pada PHP digunakan untuk menghasilkan waktu tertentu dengan format timestamp. Format penulisan fungsi strtotime()
adalah sebagai berikut:strtotime(string, timestamp);
Penjelasan:
- String disini mencerminkan tanggal baik berbentuk karakter tanggal (Date atau Time Format) maupun kata atau kalimat (dalam bahasa Inggris) yang merujuk pada waktu tertentu (Relative Format). Misal:
echo strtotime('now'); // Relative Format echo strtotime('2017-01-16'); // Date format echo strtotime('17:10:00'); // Time format
- Argumen timestamp bersifat opsional, jika diisi, argumen ini akan menjadi acuan waktu. Perhatikan contoh berikut:
<?php $timestamp = strtotime('2017-02-28'); // 1488236400 echo date('d-m-Y', strtotime('+1 day', $timestamp)); // 01-03-2017
Pada contoh diatas, fungsi strtotime menghasilkan timestamp waktu 1 hari setelah 28 Februari 2017, yaitu 01 Maret 2017. dari contoh diatas terlihat bahwa yang menjadi acuan adalah tanggal 2017-02-28
Argumen string dapat dikelompokkan menjadi dua yaitu Date Time format dan relative format.
1Date Time format
Untuk string berbentuk date format, maka, penting diperhatikan ketika menggunakan separator, untuk separator slash (/), maka PHP akan membacanya dengan format
m/d/y
, misal:01/10/2017 atau 1/10/2017 yang artinya tanggal: 10 Januari 2017.echo strtotime('1/10/2017'); // Hasil: 1484002800
echo strtotime('01/10/2017'); // Hasil: 1484002800
Bagi kita di Indonesia, maka perlu berhati hati, karena kita lazim menggunakan format
d/m/y
. Jika kita gunakan format tersebut, maka hasil yang diperoleh tidak sesuai dengan yang diharapkan.echo strtotime('10/1/2017'); // Hasil: 1506808800
echo strtotime('10/01/2017'); // Hasil: 1506808800
Sedangkan untuk penggunaan dash (-), PHP akan membacanya dengan format
d-m-y
, Misal: 10-1-2017 atau 10-01-2017:echo strtotime('10-1-2017'); // Hasil: 1484002800
echo strtotime('10-01-2017'); // Hasil: 1484002800
Untuk mengatasi perbedaan diatas, disarankan untuk selalu menggunakan standar waktu ISO 8601 dengan format YYYY-MM-DD. Misal:
echo strtotime('2017-01-10'); // Hasil: 1484002800
sedangkan untuk time format, gunakan format H:i:s (jam:menit:detik), misal:
echo strtotime('2017-01-10 14:12:55'); // Hasil: 1484053975
2Relative format
Relative format berupa kata atau kalimat dalam bahasa Inggris yang mencerminkan waktu tertentu, misal: “now”, “yesterday”, dll. Disamping itu, relative format ini juga dapat digabungkan dengan date time format, misal: “yesterday 18:21”
Relative format dapat berbentuk simbol dan day-based notation. Adapun untuk simbol adalah sebagai berikut:
Deskripsi | Keterangan |
---|---|
Nama hari | ‘sunday’ | ‘monday’ | ‘tuesday’ | ‘wednesday’ | ‘thursday’ | ‘friday’ | ‘saturday’ |
Nama hari (3 digit) | ‘sun’ | ‘mon’ | ‘tue’ | ‘wed’ | ‘thu’ | ‘fri’ | ‘sat’ |
Urutan | ‘first’ | ‘second’ | ‘third’ | ‘fourth’ | ‘fifth’ | ‘sixth’ | ‘seventh’ | ‘eighth’ | ‘ninth’ | ‘tenth’ | ‘eleventh’ | ‘twelfth’ |
Reltext | ‘last’ | ‘next’ | ‘previous’ | ‘this’ |
Unit* | ‘year’ | ‘month’ | ‘day’ | ‘hour’ | ‘minute’ | ‘min’ | ‘second’ | ‘sec’ |
*) untuk Unit, jika jamak maka ditambahkan akhiran s, misal: 1 month, jamaknya: 2 months
Contoh:
echo date('Y-m-d H:i:s'); // 2017-01-17 16:16:58
echo date('Y-m-d H:i:s', strtotime('next month')); // 2017-02-17 16:16:58
echo date('Y-m-d H:i:s', strtotime('previous day'))'; // 2017-01-16 16:16:58
echo date('Y-m-d H:i:s', strtotime('previous hour'))'; // 2017-01-17 15:16:58
Selain simbol, terdapat notasi berdasarkan hari (day-based notation), diantaranya:
Fomat | Keterangan |
---|---|
‘today’ | ‘midnight’ | ‘yesterday’ | ‘tomorrow’ | Waktu akan berubah menjadi 00:00:00 |
‘now’ | Menunjukkan waktu sekarang (diabaikan) |
‘first day of’ | Misal: ‘first day of next month’ atau ‘first day of may 2017’ |
‘last day of’ | Misal: ‘last day of previous month’ |
number [spasi] unit atau week. | Misal: ‘1 day’ atau sama dengan ‘+1 day’, ‘-1 day’, ‘+5 weeks’ |
‘ago’ | Misal: ‘2 days ago’, ‘2 months 1 day ago’, ‘1 hour ago’ |
nama hari | Menghasilkan hari berikutnya. Misal: jika hari ini Kamis, maka ‘monday’ akan menghasilkan senin berikutnya |
Reltext [spasi] nama hari [spasi] week | Misal: ‘Monday last month’ menghasilkan hari Senin terakhir pada bulan sekarang. |
Penting diperhatikan bahwa semua format, baik simbol maupun day-based notation semua ditulis menggunakan huruf kecil dan bersifat case sensitive (membedakan huruf besar), sehingga, jika ‘last day of’ kita tulis dengan ‘Last day of’, maka, hasil yang diperoleh tidak sesuai yang diharapkan
Fungsi waktu diatas berguna untuk berbagai keperluan diantaranya untuk mengetahui hari terakhir suatu bulan, menghitung batas waktu suatu kegiatan, mencari popular post 24 jam terakhir, dll
date_default_timezone_set('Asia/Jakarta');
echo 'Tanggal sekarang: ' . date('d-m-Y H:i:s', strtotime('now'));
echo 'Akhir Februari: ' . date('d-m-Y', strtotime('last day of february 2017'));
echo 'Batas submit laporan: ' . date('d-m-Y H:i:s', strtotime('3 month 23:59'));
echo 'Jatuh tempo: ' . date('d-m-Y H:i:s', strtotime('next friday 12:00'));
echo '24 jam terakhir: ' . date('d-m-Y H:i:s', strtotime('-24 hours'));
Hasil:
Tanggal sekarang: 18-01-2017 05:15:51 Akhir Februari: 28-02-2017 Batas submit laporan: 18-04-2017 23:59:00 Jatuh tempo: 20-01-2017 12:00:00 24 jam terakhir: 17-01-2017 05-15-51
IV. Kesimpulan
PHP menyediakan banyak sekali fungsi terkait waktu, tiga diantaranya adalah
time()
, strtotime()
, dan mktime()
, ketiganya memiliki kelebihan sendiri-sendiri dan dapat saling melengkapi.
Ketiga fungsi tersebut wajib dikuasai, sebagai acuan kapan menggunakannya, pertimbangkan hal berikut:
- Fungsi
time()
hanya memiliki satu output yaitu timestamp waktu sekarang dalam zona waktu GMT + 0. Manipulasi fungsi ini, hanya dapat dilakukan dalam satuan detik. - Fungsi
mktime()
ini mirip sekali dengantime()
, biasa jadi karena namanya yang juga mirip.mktime()
lebih fleksibel daritime()
karena memiliki banyak argumen, namun keleluasaan manipulasi waktu hanya terbatas pada unit waktu, yaitu, jam, menit, detik, bulan, hari, dan tahun. - Fungsi
strtotime()
paling fleksibel karena dapat menghitung waktu dengan acuan yang fleksibel misal: menghitung waktu satu bulan kedepan, hari terakhir suatu bulan, satu hari yang lalu, dll, dimana hal ini sulit dilakukan oleh kedua fungsi lainnya.Selain itu, fungsi ini juga dapat menggantikantime()
, yaitu dengan memberikan argumen now:strtotime('now')
. Fungsi ini juga bisa menggantikan fungsimktime()
, misal:strtotime('2017-02-20 18:32:00)
sama denganmktime(18,32,11,2,20,2017)
Berdasarkan hal tersebut diatas, saran saya, selalu pertimbangkan penggunaan fungsi
strtotime()
, sebelum menggunakan fungsi lainnya.
Demikian pembahasan mengenai fungsi
time()
, mktime()
, dan strtotime()
pada PHP, semoga bermanfaat.
Komentar
Posting Komentar