Pengolahan tanggal adalah salah satu kebutuhan paling penting dalam dunia pemrograman. Hampir setiap aplikasi membutuhkan logika terkait waktu, entah itu menghitung berapa lama pengguna sudah bergabung, menentukan masa aktif langganan, menghitung lama cuti, hingga memproses jadwal pengiriman barang. Dalam PHP, terdapat banyak cara untuk menghitung selisih tanggal, dari yang sederhana menggunakan strtotime() hingga yang lebih modern menggunakan DateTime dan DateInterval.
Artikel ini akan mengupas berbagai teknik untuk menghitung selisih tanggal dengan PHP, dilengkapi contoh implementasi dari level dasar hingga lanjutan.
Dasar Perhitungan dengan strtotime()
Cara paling klasik adalah menggunakan strtotime(). Fungsi ini mengonversi string tanggal menjadi timestamp Unix (jumlah detik sejak 1 Januari 1970). Dengan begitu, selisih tanggal cukup dihitung dengan operasi pengurangan.
<?php
$tanggal1 = strtotime("2025-09-01");
$tanggal2 = strtotime("2025-09-19");
$selisihDetik = $tanggal2 - $tanggal1;
$hari = $selisihDetik / (60 * 60 * 24);
echo "Selisih: $hari hari"; // Hasil: 18 hari
?>
Metode ini cepat dan cocok untuk keperluan sederhana. Namun, saat butuh detail seperti perbedaan tahun dan bulan, kita harus melakukan logika manual.
Pendekatan Modern dengan DateTime dan DateInterval
Objek DateTime membuat perhitungan tanggal jauh lebih terstruktur. Dengan metode diff(), kita bisa langsung mendapatkan selisih dalam bentuk objek DateInterval.
<?php
$tanggal1 = new DateTime("2025-09-01");
$tanggal2 = new DateTime("2025-09-19");
$interval = $tanggal1->diff($tanggal2);
echo "Selisih total: " . $interval->days . " hari\n";
echo "Detail: $interval->y tahun, $interval->m bulan, $interval->d hari";
?>
Hasilnya bukan hanya jumlah hari total, tapi juga kombinasi tahun, bulan, dan hari. Pendekatan ini lebih rapi dan fleksibel, sangat cocok untuk aplikasi skala besar.
Menghitung Selisih dalam Jam, Menit, dan Detik
Selain hari, kita kadang butuh menghitung durasi dalam satuan jam atau menit, misalnya dalam aplikasi transportasi, peminjaman ruangan, atau sistem event.
<?php
$t1 = new DateTime("2025-09-19 08:00:00");
$t2 = new DateTime("2025-09-20 14:30:00");
$interval = $t1->diff($t2);
echo $interval->format("Durasi: %a hari %h jam %i menit %s detik");
// Output: Durasi: 1 hari 6 jam 30 menit 0 detik
?>
Dengan format(), kita bisa menyesuaikan tampilan output sesuai kebutuhan.
Studi Kasus 1: Menghitung Usia dengan PHP
Menghitung usia adalah contoh klasik penggunaan perbedaan tanggal. Dengan DateTime, hasil bisa lebih akurat.
<?php
$tanggalLahir = new DateTime("1990-05-15");
$sekarang = new DateTime();
$usia = $tanggalLahir->diff($sekarang);
echo "Usia: " . $usia->y . " tahun, " . $usia->m . " bulan, " . $usia->d . " hari";
?>
Output bisa dipakai untuk validasi usia minimum pengguna saat registrasi, misalnya memastikan hanya yang berusia di atas 18 tahun yang bisa mendaftar.
Studi Kasus 2: Hitung Masa Kerja Karyawan
Dalam sistem HR, kita sering menghitung lama kerja seorang karyawan. Misalnya, dari tanggal bergabung hingga hari ini.
<?php
$joinDate = new DateTime("2015-03-01");
$today = new DateTime();
$masaKerja = $joinDate->diff($today);
echo "Masa kerja: " . $masaKerja->y . " tahun " . $masaKerja->m . " bulan";
?>
Kode ini bisa diintegrasikan untuk menentukan hak cuti, bonus tahunan, atau masa pensiun.
Studi Kasus 3: Hitung Jatuh Tempo Pembayaran
Dalam aplikasi keuangan, menghitung tanggal jatuh tempo sangat penting. Kita bisa menentukan berapa hari tersisa sebelum pembayaran harus dilakukan.
<?php
$jatuhTempo = new DateTime("2025-10-10");
$hariIni = new DateTime();
$selisih = $hariIni->diff($jatuhTempo);
if ($jatuhTempo < $hariIni) {
echo "Tagihan sudah lewat " . $selisih->days . " hari";
} else {
echo "Sisa waktu: " . $selisih->days . " hari";
}
?>
Logika ini bisa dipakai untuk sistem reminder otomatis kepada pengguna.
Menghitung Selisih dengan Format Kustom
Kadang kita ingin menampilkan hasil perhitungan dengan format kalimat. DateInterval::format() memudahkan hal ini.
<?php
$t1 = new DateTime("2024-01-01");
$t2 = new DateTime("2025-09-19");
$interval = $t1->diff($t2);
echo $interval->format("Selisih %y tahun, %m bulan, dan %d hari");
?>
Hasilnya menjadi lebih mudah dibaca, cocok untuk laporan resmi atau notifikasi aplikasi.
Studi Kasus 4: Hitung Lama Pinjam Buku di Perpustakaan
Aplikasi perpustakaan membutuhkan perhitungan lama peminjaman, sekaligus denda jika lewat batas waktu.
<?php
$pinjam = new DateTime("2025-09-01");
$kembali = new DateTime("2025-09-20");
$batas = 14; // 14 hari
$lama = $pinjam->diff($kembali)->days;
if ($lama > $batas) {
$denda = ($lama - $batas) * 2000; // Rp2000 per hari
echo "Terlambat $lama hari. Denda: Rp$denda";
} else {
echo "Masih dalam batas waktu.";
}
?>
Studi kasus ini langsung menghubungkan logika tanggal dengan aturan bisnis.
Studi Kasus 5: Hitung Lama Sesi Login atau Token
Dalam sistem keamanan, token atau sesi login biasanya punya masa berlaku tertentu. Kita bisa cek apakah token sudah kadaluarsa dengan menghitung selisih waktunya.
<?php
$tokenCreated = new DateTime("2025-09-19 08:00:00");
$now = new DateTime();
$interval = $tokenCreated->diff($now);
if ($interval->h >= 2 || $interval->days > 0) {
echo "Token expired";
} else {
echo "Token masih aktif";
}
?>
Implementasi ini sering digunakan di aplikasi berbasis API.
Studi Kasus 6: Membandingkan Tanggal Antar Zona Waktu
Dalam aplikasi global, perbedaan zona waktu sangat penting. PHP DateTimeZone bisa membantu.
<?php
$jakarta = new DateTime("2025-09-19 10:00:00", new DateTimeZone("Asia/Jakarta"));
$ny = new DateTime("2025-09-19 10:00:00", new DateTimeZone("America/New_York"));
$interval = $jakarta->diff($ny);
echo "Perbedaan waktu: " . $interval->h . " jam";
?>
Studi kasus ini penting untuk aplikasi meeting internasional atau sistem booking lintas negara.
Studi Kasus 7: Hitung Countdown Event
Aplikasi event sering menampilkan hitung mundur menuju acara. Selisih tanggal bisa diubah menjadi countdown.
<?php
$event = new DateTime("2025-12-31 23:59:59");
$now = new DateTime();
$interval = $now->diff($event);
echo $interval->format("Tersisa %a hari %h jam %i menit lagi menuju acara!");
?>
Hasilnya bisa ditampilkan langsung di website untuk menarik perhatian pengunjung.
Membuat Fungsi Helper untuk Selisih Tanggal
Agar lebih mudah digunakan, kita bisa membungkus logika ini dalam sebuah fungsi.
<?php
function hitungSelisih($tgl1, $tgl2) {
$d1 = new DateTime($tgl1);
$d2 = new DateTime($tgl2);
return $d1->diff($d2)->format("%y tahun, %m bulan, %d hari");
}
echo hitungSelisih("2010-01-01", "2025-09-19");
?>
Dengan begitu, logika perhitungan bisa dipakai ulang di berbagai bagian aplikasi.
Studi Kasus 8: Hitung Interval Berulang (Recurring)
Misalnya, kita ingin menghitung selisih tiap 30 hari sekali (langganan bulanan). PHP punya DatePeriod untuk iterasi tanggal.
<?php
$mulai = new DateTime("2025-01-01");
$akhir = new DateTime("2025-06-01");
$interval = new DateInterval("P30D");
$periode = new DatePeriod($mulai, $interval, $akhir);
foreach ($periode as $tanggal) {
echo $tanggal->format("Y-m-d") . "\n";
}
?>
Kode ini menghasilkan daftar tanggal pembayaran bulanan. Cocok untuk aplikasi subscription.
Studi Kasus 9: Selisih dengan Format Kalender Hijriah atau Lokal
Beberapa aplikasi butuh perhitungan tanggal dalam format lokal, misalnya kalender Hijriah. Meskipun PHP bawaan tidak punya konversi langsung, kita bisa gunakan ekstensi atau API lalu tetap menghitung selisih dengan cara yang sama.
Contoh pseudo-code:
// Misalnya konversi ke Hijriah dulu dengan ekstensi
$tglMasehi = new DateTime("2025-09-19");
// Konversi ke Hijriah via library -> $tglHijriah
// Selisih dihitung tetap via DateTime
Pendekatan ini umum untuk aplikasi berbasis keagamaan atau kalender lokal.
Studi Kasus 10: Hitung Estimasi Proyek
Dalam project management, menghitung berapa lama proyek berlangsung adalah hal wajib.
<?php
$mulai = new DateTime("2025-07-01");
$selesai = new DateTime("2025-09-19");
$interval = $mulai->diff($selesai);
echo "Durasi proyek: " . $interval->days . " hari kerja";
?>
Jika ditambah logika pengecualian hari libur, hasilnya bisa jadi lebih realistis.
