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 yaitu 1484701662
    <?php
    echo strtotime('now');
    echo mktime();
    echo time();
    Ketiganya akan menghasilkan timestamp yang sama, namun, sejak PHP versi 5.1, jika kita menjalankan fungsi mktime() tanpa argumen, akan muncul peringatan agar menggunakan fungsi time()
  • 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:
DeskripsiKeterangan
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:
FomatKeterangan
‘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 hariMenghasilkan hari berikutnya. Misal: jika hari ini Kamis, maka ‘monday’ akan menghasilkan senin berikutnya
Reltext [spasi] nama hari [spasi] weekMisal: ‘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 dengan time(), biasa jadi karena namanya yang juga mirip. mktime() lebih fleksibel dari time() 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 menggantikan time(), yaitu dengan memberikan argumen now: strtotime('now'). Fungsi ini juga bisa menggantikan fungsi mktime(), misal: strtotime('2017-02-20 18:32:00) sama dengan mktime(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

Postingan populer dari blog ini

Login, Session, dan Logout

Cara Membuat File Setup / Installer Aplikasi Sendiri dengan Inno Setup Compiler