Memahami Fungsi Time, Strtotime, dan Mktime Pada PHP – Memanipulasi Waktu

Pada kesempatan yang baik ini kita akan membahas tentang fungsi time, mktime, dan strtotime pada PHP.

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.

1 Date 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

2 Relative 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 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.

Subscibe Now

Suka dengan artikel di Jagowebdev.com? jangan sampai ketinggalan, segera join ke milis kami untuk update informasi terbaru dari Jagowebdev.com

Komitmen Kami: Kami senantiasa menghargai privasi Anda dan tidak akan membagikan identitas Anda ke pihak manapun.

26 Feedback dari pembaca

  • Selamat Sore mas…
    Kalau mau membuat variable waktu yang kita set contoh:
    $jam_masuk=strtotime(’06:50:00′);
    supaya nilai tersebut bisa tampil dalam php dengan format 06:50:00 bagaimana caranya mas…
    dan variable tersebut bisa digunakan untuk dijadikan untuk menghitung:
    1. jam datang
    2. jam pulang dan
    3. jam lembur.
    terima kasih sebelumnya.

    • Kalo kita mau input range Time :
      Contohnya :
      Input Jam Di tanggal hari ini adalah 09:00 – 11:00 + 15 menit kemudian Outputnya adalah 09:15, kemudian di input lagi range di atas outputnya menjadi 09:30 di input lagi range di atas menjadi 09:45 dan seterusnya.

      Seperti itu gimana yah kodingannya ?

  • selamat sore pak mohon bantuannya, kalau mau menampilkan waktu hari dalam satu minggu
    senin selasa rabu kamis jumat sabtu minggu
    senin tanggal 1 selasa tanggal 2 rabu tanggal 3 dst
    dan kembali senin tanggal 14 dst
    terima kasih

    • Itu bisa dicoba menggunakan fungsi date() dengan menmpilkan hari mas, misal 1 untuk senin, 2 untuk selasa, dst. Kemudian angka itu diterjemahkan ke kalimat, misal 1 menjadi senin, 2 menjadi selasa, dst…

  • selamat siang pak saya mau tanya bagaiman cara mencegah duplikasi input data pada hari yang sama
    saya coba query dengan ini kok masih bisa input data mohon bantuanya :

    $RUANGAN = $_POST[‘RUANGAN’];
    $TANGGAL = $_POST[‘TANGGAL’];
    $NO_REGISTER = $_POST[‘NO_REGISTER’];
    $NAMA = $_POST[‘NAMA_PASIEN’];

    $cek = “SELECT *FROM KELENGKAPAN_ASSESMEN WHERE NO_REGISTER =’$NO_REGISTER’ “;
    $validasi = sqlsrv_query($conn, $cek);

    if (sqlsrv_num_rows($validasi)>0){

    }

    $querySimpan = “INSERT INTO KELENGKAPAN_ASSESMEN (RUANGAN, TANGGAL, NO_REGISTER, NAMA)
    VALUES(‘$RUANGAN’, ‘$TANGGAL’, ‘$NO_REGISTER’, ‘$NAMA’)”;

    $simpan = sqlsrv_query($conn, $querySimpan);

    if ($simpan)
    {
    terima kasih

  • terima kasih pak sudah menjawab, iya mencegah nya duplikasi data berdasarkan data kolom NO_REGISTER pak,

    RUANGAN TANGGAL NO_REGISTER NAMA
    ASTER 2019-11-18 000000 Ismy Dianty
    ANGGREK 2019-11-18 000000 Ulfa Fitria Anggraeni
    ANGGREK 2019-11-20 000000 Heriyono
    ANGGREK 2019-11-20 000000 Beti Wulandari
    ANGGREK 2019-11-18 000000 Ulfa Fitria Anggraeni
    ANGGREK 2019-11-18 000000 Tatang Kurniawan
    NULL NULL NULL NULL

    ini data tabel nya yang ada di database

  • selamat pagi pak mohon bantuannya saya ada masalah dengan cara menampilkan data berdasarkan bulan
    <?php
    $query = "SELECT COUNT (*) AS kamar FROM INDIKATOR
    WHERE KONDISI = '1' AND RUANGAN ='KAMAR' AND MONTH
    (TANGGAL)='$bulan' ";
    $hasil = sqlsrv_query($conn, $query);
    $data = sqlsrv_fetch_array($hasil);
    $kamar = $data['kamar'];

    kenapa muncul error seperti ini
    Warning: sqlsrv_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\siimut\pmkp.php on line 140

    mohon bantuannya terimakasih

  • Maaf mas mau tanya, kalo mau membuat batasan waktu booking yaitu melakukan order 2 jam sebelum waktu kedatangan, caranya bagaimana?

  • echo date(‘d-m-Y’, strtotime(“+2 Months”, strtotime(“30-12-2019”)));
    Hasil 01-03-2020

    Pernyataan, gimana caranya biar hasilnya 29-02-2020 bukan 01-03-2020. Karena memang umur bulan hanya 29. Keperluannya untuk jatuh tempo, seperti fungsi EDATE() di Ms. Excel.

  • bagaimana mengconvert tahun yang dalam data hanya dua digit misal tgl 19-01-68 tapi setelah di convert terbaca 01-01-1970 bukan 19-01-1968??

  • misi mau nanya, misal user sudah input di jam 02:00 – 03:00. lalu bagaimana supaya user lain tidak input di rentang waktu itu?
    misal user lain input di jam 02:30 – 03:30 jadinya tidak bisa gitu, tau ga caranya maz?

Silakan tinggalkan komentar

Newsletter

Jadilah yang pertama tahu berita terbaru dari Jagowebdev.com