Skip to main content

PHP :: Selisih Jam

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:

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

Rudi-est said…
Mas... aku punya permasalahan tentang selisih waktu juga... cuma aku ngga pake mktime... cuma pake date... jika pake date... yang dikurangin jam nya doang... gimana mas... klu gini :
08:00:00 - 16:59:59 hasilnya bisa 7 jam 59 Menit 59 Detik.... atau -7:59:59... ngga papa deh...
Yudi Kurniawan said…
Salam,
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.
Rudi-est said…
Mas... makasih ya... kapan2 bantuin lagi...
Rudi-est said…
Wah... mas... saya mengalami kendala jadinya klu hanya menggunakan date ('H:i:s')... jadi jika ada yang kerja lembur atau yang malam hari... mulai jam 7 Sore tgl 18 Juni , pulangnya jam 6 pagi tgl 19 juni... hasilnya kacau...
Anonymous said…
Wah thanks yaa

From:www.sampara.com
Anonymous said…
wkwkkwk.. gitu aja koq repot
Nih gw kasih sample ringan :

$h = date("h");
$i = date("i");
$h = $h-1 ;

echo "jam = $h:$i";
Anonymous said…
pake datediff-nya sql dong mas
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
Anonymous said…
Kalo mau nyari selisih waktu sis ganti formatnya aja

jadi kayak gini

$waktuAwal = "jam:menit:detik";
$waktuAkhir = "jam:menit:detik";
Yudi Kurniawan said…
Thanks semua buat saran-sarannya.
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.
Cream Sari said…
$hari = strtotime(str_replace("-","/", '2009-12-12')) - strtotime(str_replace("-","/", '2009-11-12'));
$val = round($hari/86400).' Hari';
echo $val;
Cream Sari said…
ga sah ribet2 cuy
ada cara cepat N mudah ko
di bikin sulit

Popular posts from this blog

PostGreSQL :: Hitung Umur

Ternyata untuk menghitung umur dari data yang disimpan di PostGreSQL sangat gampang. PostGreSQL sendiri sudah menyediakan fungsi yang mendukung. Beberapa fungsi yang bisa dipakai adalah AGE dan EXTRACT. AGE dipakai untuk menghitung umur dari sebuah data, dibandingkan dengan hari ini, atau dengan data lain (tipenya timestamp). Misal: age(timestamp '1980-09-27'), akan menghasilkan nilai (bertipe interval) "24 years 1 mon 25 days". Nah, kalau mau mengambil nilai tahunnya saja, tinggal menggunakan EXTRACT Contoh: EXTRACT(year FROM AGE(timestamp '2001-09-27')), hasilnya akan jadi 24.

Delphi :: Split String

Akhirnya ketemu juga cara untuk melakukan split string. (Terbiasa pakai PHP sih, yang sangat memanjakan dalam pengelolaan string.) Di sini memanfaatkan TStringList, unit Classes. // procedure untuk split string procedure Split (const Delimiter: Char; // delimiter charachter Input: string; // input string const Strings: TStrings) ; // list of string result begin Assert(Assigned(Strings)) ; Strings.Clear; Strings.Delimiter := Delimiter; Strings.DelimitedText := Input; end; // contoh pemakaian procedure TForm1.Button1Click(Sender: TObject) ; var A: TStringList; begin A := TStringList.Create; try Split(' ', 'your delphi guide', A) ; ShowMessage(a[0]) ; //your ShowMessage(a[1]) ; //delphi ShowMessage(a[2]) ; //guide finally A.Free; end; end; Source : http://delphi.about.com/cs/adptips2002/a/bltip1102_5.htm Wheew .. akhirnya. One step ahead!!