Pengolahan Waktu di PHP
Di artikel ini kita akan mencoba mengetahui salah satu fungsi di php yaitu date dan mktime, yg sangat berguna untuk pengolahan waktu seperti, validasi, perbandingan,pengurangan dan penambahan. Pengolahan waktu sangatlah penting jika aplikasi kamu berhubungan dgn validasi dan perbandingan waktu, misal: masa berlaku keanggotaan, memberi peringatan jika masa berlaku akan habis sebentar lagi, aplikasi kalender, dan banyak lagi.
jika kita membaca manual dari php, dapat dijelaskan sbb:
date
syntak: int date (string format, int [timestamp])
fungsi: menghasilkan waktu sesuai dengan format waktu yg diberikan
contoh(diasumsikan saat ini tgl 24 februari 2002):
$sekarang = date("d-m-Y"); /*akan menghasilkan 24-02-2002*/
$sekarang = date("j F Y"); /*akan menghasilkan 24 February 2002*/
d akan memformat bulan dgn dua dua digit mulai 01 sampai 12
m akan memformat tanggal dgn dua digit mulai 01 sampai 30
Y akan memformat tahun dgn empat digit misal. 1999,2002,dsb
j akan memformat tanggal dgn menghilangkan angka 0 didepan mulai 1 sampai 31
n akan memformat bulan dgn menghilangkan angka 0 didepan mulai 1 sampai 12
F akan memfromat bulan dgn tekstual lengkap misal. March, December,dsb
Masih banyak lagi parameter waktu yg bisa digunakan, sebaiknya kamu membaca manual dari php untuk mengetahui secara lengkap parameter lainnya
mktime
syntak: int mktime (int hour, int minute, int second, int month, int day, int year [, int is_dst])
fungsi: untuk mendapatkan format waktu UNIX dlm detik (long integer) terhitung mulai dari 1 januari 1970
contoh:
$sekarang = mktime(0,0,0,date("m"),date("d"),date("Y")); /* akan menghasilkan 1014483600*/
$waktu = mktime(0,0,0,11,22,98); /*akan menghasilkan 911667600*/
$waktu = date("j F Y", mktime(0,0,0,7,9,2002)); /*akan menghasilkan 9 July 2002*/
Kesalahan yg bisa dibenarkan
salah satu kelebihan fungsi mktime adalah mampu mengkoreksi kesalahan format waktu yang kita tulis. misal:
$waktu = date("j F Y", mktime(0,0,0,7,34,2001));
$waktu = date("j F Y", mktime(0,0,0,13,2,2001));
Penulisan variabel pertama diatas adalah sah saja, karena nilai 34 (tidak ada tanggal 34) otomatis akan dirubah menjadi tgl 31 ditambah 3 sehingga menghasilkan 3 August 2001. begitu juga pada variabel kedua akan menghasilkan 2 Janury 2002 (tidak ada bulan 13 maka otomatis dirubah menjadi 12 ditambah 1 bulan kedepan)
Sekarang kita akan mencoba memanfaatkan kedua fungsi tersebut untuk membantu kita dlm pengolahan waktu. pembahasan artikel ini hanya mencakup pemanfaatan format tanggal, bulan dan tahun saja dan menghiraukan format jam, menit dan detik sehingga kita cukup mengisi jam, menit dan detik dengan 0. Anda bisa mencoba sendiri bereksperimen dgn format waktu lainnya.
Contoh 01. penambahan dan pengurangan waktu
jika kita ingin mengetahui waktu pd saat 3 hari yg akan datang (andaikan hari ini tgl 10 Oktober 2001), dengan mudah kita bisa menuliskannya sbb:
$tambahwaktu = date("d F Y", mktime(0,0,0,date("m"),date("d")+3,date("Y"))); /*menghasilkan 27 February 2002*/
echo ("tiga hari yg akan datang jatuh pada tgl $tambahwaktu");
perhatikan penambahan 3 di bagian date(“d”) yg dimaksudkan untuk menambahkan interval 3 hari ke depan. jika kita ingin mengetahui interval bulan, maka cukup menambahkannya pada bagian date(“m”) dan yg lainnya dgn prinsip yg sama. contoh lain:
$kurangtanggal = date("d F Y", mktime(0,0,0,date("m"),date("d")-14,date("Y"))); /*menghasilkan 10 February 2002*/
echo ("dua minggu yg lalu jatuh pada tgl $kurangtanggal");
$kurangbulan = date("d F Y", mktime(0,0,0,date("m")-7,date("d"),date("Y"))); /*menghasilkan 24 July 2001*/
echo ("tujuh bulan yg lalu jatuh pada tgl $kurangbulan");
Contoh02. validasi waktu dari masukan form.
Sekarang kita akan mencoba langsung pemanfaatan fungsi date dan mktime dalam sebuah form html dengan membandingkan dua buah waktu sesuai kondisi yang kita inginkan. Diasumsikan bahwa kamu sudah mengetahui penulisan form pada html. Dlm contoh ini kita akan membuat bagian dari sebuah proses reservasi dimana user memilih tanggal checkin dan checkout dengan kondisi sbb:
1. minimal selisih tanggal checkin adalah 3 hari setelah waktu saat ini
2. jarak antara checkin dan checkout minimal 2 hari, dgn kata lain; reservasi minimal 2 hari
3. form secara default akan menampilkan waktu 3 hari setelah waktu saat ini pd checkin dan selisih dua hari dari checkin, pada form checkout
yg akan kita lakukan adalah membuat form waktu checkin dan checkout yg nantinya akan dipilih user. kemudian field-field tersebut secara default (menggunakan atribut “selected” pada tag
pertama, kita akan membuat sebuah file, kita beri nama tanggal.php yg berisikan form yg akan diproses oleh sebuah file yg bernama validasi.php (comment diantara /* dan */), sbb:
<?php
/* tanggal.php */
/* buat array bulan */
$bulan = array(1=>'Jan',2=>'Feb',3=>'Mar',4=>'Apr',5=>'May',6=>'Jun',7=>'Jul',8=>'Aug',9=>'Sep',10=>'Oct',11=>'Nov',12=>'Dec');
/* definisikan variabel-variabel tgl, bulan dan tahun utk dipakai sbg pembanding pd tag option */
$checkin = mktime(0,0,0,date("m") ,date("d")+3,date("Y"));
$indate = date("j", $checkin);
$inmonth = date("n", $checkin);
$inyear = date("Y", $checkin);
$checkout = mktime(0,0,0,date("m") ,date("d")+5,date("Y"));
$outdate = date("j", $checkout);
$outmonth = date("n", $checkout);
$outyear = date("Y", $checkout);
?>
<html>
<body>
<form method="post" action="validasi.php">
<p>check-in:
<select name="intanggal">
<?php
/* buat loop utk tgl sampe batasnya. yg lain juga sama */
for ($i=1; $i <= 31; $i++) {
/* jika $indate sama dgn $i, maka buat terselect secara default pd tag select. yg lain juga sama */
if ($i == $indate){ $selectdate ="selected";} else {$selectdate="";}
echo ("<option value=\"$i\" $selectdate>$i</option>"."\n");
}
?>
</select>
<select name="inbulan">
<?php
for ($i=1; $i <= 12; $i++) {
if ($i == $inmonth){ $selectmonth ="selected";} else {$selectmonth="";}
echo ("<option value=\"$i\" $selectmonth>$bulan[$i]</option>"."\n");
}
?>
</select>
<select name="intahun">
<?php
for ($i=2002; $i <= 2003; $i++) {
if ($i == $inyear){ $selectyear ="selected";} else {$selectyear="";}
echo ("<option value=\"$i\" $selectyear>$i</option>"."\n");
}
?>
</select>
</p>
<p>check-out:
<select name="outtanggal">
<?php
for ($i=1; $i <= 31; $i++) {
if ($i == $outdate){ $selectdate ="selected";} else {$selectdate="";}
echo ("<option value=\"$i\" $selectdate>$i</option>"."\n");
}
?>
</select>
<select name="outbulan">
<?php
for ($i=1; $i <= 12; $i++) {
if ($i == $outmonth){ $selectmonth ="selected";} else {$selectmonth="";}
echo ("<option value=\"$i\" $selectmonth>$bulan[$i]</option>"."\n");
}
?>
</select>
<select name="outtahun">
<?php
for ($i=2002; $i <= 2003; $i++) {
if ($i == $outyear){ $selectyear ="selected";} else {$selectyear="";}
echo ("<option value=\"$i\" $selectyear>$i</option>"."\n");
}
?>
</select>
</p>
<p>
<input type="submit" value="cek waktu">
</p>
</form>
</body>
</html>
Mari kita perhatikan satu-persatu,
$bulan berisi array utk mempopulasi option bulan di form. Jika kamu belum memahami array, silahkan mambaca manual php. Untuk saat ini kita tidak akan membahasnya.
$checkin akan menghasilkan format waktu 3 hari setelah saat ini, yg kemudian diambil tanggalnya saja pada variabel $indate. $indate sendiri akan memformat waktu berdasarkan format dua digit tanpa 0 didepan, sesuai dgn value yg kita punya di option tanggal. begitu juga dengan $inmonth dan $inyear yg mengambil format bulan dua digit dan format tahun empat digit.
bisa saja kita mendapatkan hasil dgn nilai yg sama dgn hanya menggunakan fungsi date. seperti pada cara kedua sbb:
$indate = date("d")+3;
namun apabila kita menambahkannya dgn 35, maka format tanggal diatas menjadi tidak sah lagi, lain halnya dgn mktime yg otomatis memperbaiki kesalahan. dgn pertimbangan fleksibilitas serta mengurangi resiko kesalahan maka kita akan menggunakan cara pertama walaupun lebih panjang dari cara kedua.
sekarang, perhatikan code-snippet sbb:
<select name="intanggal">
<?php
/* buat loop utk tgl sampe batasnya. yg lain juga sama */
for ($i=1; $i <= 31; $i++) {
/* jika $indate sama dgn $i, maka buat terselect secara default pd tag select. yg lain juga sama */
if ($i == $indate){ $selectdate ="selected";} else {$selectdate="";}
echo ("<option value=\"$i\" $selectdate>$i</option>"."\n");
}
?>
</select>
pada option tanggal kita akan membuat loop sampai batas 31
for ($i=1; $i <= 31; $i++) {
artinya selama $i lebih kecil atau sama dengan 31, maka $i akan ditambahkan dgn 1 dgn penulisan $i++
sebelum output kita keluarkan, kita juga men-cek, jika nilai $indate sama dgn $i maka $selectdate berisi string "selected" jika tidak nilai $selectdate kita buat kosong ""
if ($i == $indate){ $selectdate ="selected";} else {$selectdate="";}
kemudian terakhir, kita mempopulasi tag
Untuk option inbulan, sebenarnya kita juga bisa mempopulasi array bulan yg telah kita buat dengan cara sbb:
"."\n");
while(list($key,$val)=each($bulan)) {
if ($key == $inmonth){ $selectmonth ="selected";} else {$selectmonth="";}
echo ("
}
penulisan cara diatas ataupun cara sebelumnya sama saja, terserah kamu memilih yang mana.
Kini saatnya kita membuat file validasi.php,
<html>
<body>
<?php
/*validasi.php*/
$in = mktime(0,0,0,$inbulan,$intanggal,$intahun);
$out = mktime(0,0,0,$outbulan,$outtanggal,$outtahun);
$min = mktime(0,0,0,date("m"),date("d")+3,date("Y"));
$interval = mktime(0,0,0,$inbulan,$intanggal+2,$intahun);
$nowshow = date("j F Y");
$minshow = date("j F Y", $min);
if ($in < $min) {
echo ("hari ini tgl $nowshow, dan waktu checkin minimum adalah tgl $minshow, silahkan kembali");
}
elseif ($in >= $out) {
echo ("waktu checkin tidak boleh sama dengan atau lebih dari tgl checkout, silahkan kembali");
}
elseif ($interval > $out) {
echo ("jarak antara checkin dan checkout minimum 2 hari, silahkan kembali");
}
else {
echo ("terimakasih, kami akan memprosesnya!");
}
?>
</body>
</html>
Mari kita perhatikan satu persatu,
$in dan $out akan mendapatkan format waktu berdasarkan masukan user pd field checkin dan checkout.
$min adalah pembanding untuk mendapatkan nilai 3 hari setelah saat ini.
$interval akan berfungsi sbg pembanding selisih minimum 2 hari antara checkin dan checkout.
$nowshow memformat waktu sekarang dan $minshow memformat minimum waktu checkin.
setelah kita mendapatkan nilai-nilai yg diperlukan maka dgn mudah kita dapat membandingkannya sesuai dgn kondisi yg kita inginkan seperti contoh-contoh diatas. cobalah untuk men-tes script yg telah kamu buat tersebut, dan lakukan experimen lainnya misalnya membandingkan jam, menit atau detik.
contoh diatas masih sangat sederhana dan belum sempurna, seperti misal: belum ada validasi untuk tanggal di tahun kabisat. Untuk itu, kamu bisa menambahkan validasi berdasarkan tahun kabisat dengan melihat input form tahun yg jika habis dibagi 4 berarti tahun kabisat dan menggunakan parameter L di fungsi date() yang mengeluarkan nilai boolean. Atau validasi utk tgl di bln februari, dimana tidak ada tgl 30 di bulan februari.
happy coding
bermanfaat banget mas, trimakasih. apalagi buat saya yg baru belajar..
Tutorial yang bagus. Saya akan selalu tunggu totorial lainnya. It really help me much. Thanks
saya masih bingung dengan validasi diatas, semisal validasi untuk absensi. jam masuk ama jam keluar. gimana mohon pencerahannya?
Mas, saya mau tanyak dong
Bgm caranya utk mengurangi tanggal yg kita ambil dari database mysql. Tanggal ini kita input(tgl masuk dan tgl keluar). Thx ya mas, utk bantuannya.
salam,
wah . . .bagus info nya . . .terima kasih . . sangat membantu . .
Terimakasih atas tutorialnya gan, kerjaan gw kelar nih bagian pertanggalan