Setelah kemarin kesulitan untuk melakukan increment ataupun decrement terhadap variabel waktu (date/time) di PHP, kali ini nemuin masalah untuk mencari selisih waktu (dari satu jam ke jam tertentu), yang perlu untuk ngitung lembur karyawan.
Tadinya kepikiran untuk buat fungsi sendiri, yang flow-nya kira-kira begini:
- masing-masing dipisah menjadi jam, menit, detik
- bandingkan antara keduanya.
- lakukan pengurangan terhadap masing-masing komponen (jam, menit dan detik)
- gabungkan hasil perhitungan ... (selisih jam + selisih menit + selisih detik)
Tapi waktu aku ingat kasus Next Date, ... muncul ide untuk menggunakan cara yang sama, yaitu memanfaatkan format UNIX timestamp, terus nyoba mencari selisihnya. TERNYATA BERHASIL !!!
Flownya seperti ini:
- masing-masing dipisah menjadi jam, menit,detik
- ubah masing-masing ke format timestamp, gunakan fungsi mktime()
- kurangkan kedua jam
- hasilnya dibagi 60 (karena satuannya pakai menit), sementara selisih timestamp itu dalam detik
Algoritmanya seperti ini:
Mungkin ini sederhana, tapi bagiku penting :D
Ada yang tahu cara yang lebih singkat dan efektif??? Pls, let me know.
Tadinya kepikiran untuk buat fungsi sendiri, yang flow-nya kira-kira begini:
- masing-masing dipisah menjadi jam, menit, detik
- bandingkan antara keduanya.
- lakukan pengurangan terhadap masing-masing komponen (jam, menit dan detik)
- gabungkan hasil perhitungan ... (selisih jam + selisih menit + selisih detik)
Tapi waktu aku ingat kasus Next Date, ... muncul ide untuk menggunakan cara yang sama, yaitu memanfaatkan format UNIX timestamp, terus nyoba mencari selisihnya. TERNYATA BERHASIL !!!
Flownya seperti ini:
- masing-masing dipisah menjadi jam, menit,detik
- ubah masing-masing ke format timestamp, gunakan fungsi mktime()
- kurangkan kedua jam
- hasilnya dibagi 60 (karena satuannya pakai menit), sementara selisih timestamp itu dalam detik
Algoritmanya seperti ini:
if (isset($_POST['submit'])) {
list($h,$m,$s) = explode(":",$_POST['awal']);
$dtAwal = mktime($h,$m,$s,"1","1","1");
list($h,$m,$s) = explode(":",$_POST['akhir']);
$dtAkhir = mktime($h,$m,$s,"1","1","1");
$dtSelisih = $dtAkhir-$dtAwal;
echo $_POST['awal'] ." - ". $_POST['akhir'] ." = ". ($dtSelisih/60) ." menit";
}
Mungkin ini sederhana, tapi bagiku penting :D
Ada yang tahu cara yang lebih singkat dan efektif??? Pls, let me know.
Comments
08:00:00 - 16:59:59 hasilnya bisa 7 jam 59 Menit 59 Detik.... atau -7:59:59... ngga papa deh...
Kalau gak mau pakai mktime, bisa gunakan skenario berikut:
- Convert kedua tanggal menjadi integer dalam detik.
Caranya, explode. nilai = (jam * 260) + (menit * 60) + detik.
- Kalau sudah dapat integer masing-masing, tinggal dikurangi.
- Hasilnya dipecah lagi jadi jam, menit dan detik.
Detik = selisih % 60;
Menit = floor(selisih/60);
Jam = floor(selisih/360);
- Ubah ke format string, Jam:Menit:Detik.
Semoga membantu.
From:www.sampara.com
Nih gw kasih sample ringan :
$h = date("h");
$i = date("i");
$h = $h-1 ;
echo "jam = $h:$i";
nih contohnya :
$tglAwal = "2008-10-20";
$tglAkhir = "2008-10-23";
mysql_connect("namahost","namauser","pass");
mysql_select_db("namadb");
$query = "SELECT datediff('$tglAkhir', '$tglAwal') as selisih";
$hasil = mysql_query($query);
$data = mysql_fetch_array($hasil);
echo "Selisih hari antara tanggal ".$tglAwal.
" sampai tanggal ".$tglAkhir." adalah ".$data['selisih'].
" hari";
Semoga berguna
Salam
SYAHRIR NASSER
www.syahrir.web.id
jadi kayak gini
$waktuAwal = "jam:menit:detik";
$waktuAkhir = "jam:menit:detik";
FYI, aku nyari solusi sengaja mengabaikan fungsi-fungsi tanggal yang ada di PHP, karena pernah kapok, nemu keterbatasan tanggal (1970 - 2030).
Makanya, cara-cara yang kupakai adalah cara-cara kolot.
Buat Syahrir, Anda sepertinya hebat, sayangnya kurang berpikir lebih luas. Menggunakan datediff SQL sangat tergantung pada MySQL -- apakah setiap komputer atau perusahaan harus install mysql???
Apalagi, fungsi tanggal di setiap database berbeda-beda.
Well, banyak jalan ke Roma memang, silakan milih. Ada yang sederhana, ada yang rumit. PIlih saja yang optimal, yang penting kita bisa bermanfaat.
$val = round($hari/86400).' Hari';
echo $val;
ada cara cepat N mudah ko
di bikin sulit