Cara Menghitung Selisih Hari Antara Dua Tanggal
Menghitung jumlah hari antara dua tanggal terdengar sederhana, tapi setiap bahasa pemrograman menanganinya sedikit berbeda — dan edge case (DST, timezone, tahun kabisat) adalah sumber bug off-by-one yang tak terhitung. Berikut cara melakukannya dengan benar di alat yang paling sering kamu gunakan.
JavaScript
Pendekatan paling bersih: parsing kedua tanggal, kurangkan, lalu konversi milidetik ke hari.
function daysBetween(date1, date2) {
const d1 = new Date(date1);
const d2 = new Date(date2);
const msPerDay = 1000 * 60 * 60 * 24;
return Math.abs(Math.round((d2 - d1) / msPerDay));
}
console.log(daysBetween("2024-01-01", "2024-12-31"));
// 365 (2024 adalah tahun kabisat)
console.log(daysBetween("2025-03-01", "2026-03-01"));
// 365
Math.round() alih-alih Math.floor() menangani edge case 1 jam saat pergantian DST — tanpanya, kamu sesekali mendapat 364 alih-alih 365 untuk rentang 365 hari yang melewati batas DST.
Menggunakan date-fns (direkomendasikan untuk produksi):
import { differenceInCalendarDays } from 'date-fns';
const days = differenceInCalendarDays(new Date('2024-12-31'), new Date('2024-01-01'));
console.log(days); // 365
differenceInCalendarDays menghitung batas hari kalender yang dilintasi, yang biasanya lebih sesuai untuk hal-hal seperti "hari sejak login terakhir."
Python
from datetime import date
def days_between(date1: str, date2: str) -> int:
d1 = date.fromisoformat(date1)
d2 = date.fromisoformat(date2)
return abs((d2 - d1).days)
print(days_between("2024-01-01", "2024-12-31"))
# 365
print(days_between("2025-03-01", "2026-03-01"))
# 365
Pengurangan datetime.date di Python mengembalikan objek timedelta. Atribut .days memberikan jumlah hari integer — tanpa masalah DST karena objek date tidak memiliki komponen timezone.
Untuk datetime yang sadar timezone:
from datetime import datetime, timezone
def days_between_aware(dt1: str, dt2: str) -> int:
d1 = datetime.fromisoformat(dt1)
d2 = datetime.fromisoformat(dt2)
return abs((d2 - d1).days)
Excel
Excel menyimpan tanggal sebagai nomor serial (hari sejak 1 Januari 1900), sehingga pengurangan hanyalah aritmetika sederhana.
Pengurangan sederhana:
=B1 - A1
Jika A1 adalah 2024-01-01 dan B1 adalah 2024-12-31, ini mengembalikan 365. Pastikan cell diformat sebagai angka, bukan tanggal — jika tidak Excel menampilkan hasilnya sebagai tanggal.
Fungsi DAYS (lebih bersih):
=DAYS(B1, A1)
DAYS(tanggal_akhir, tanggal_awal) mengembalikan jumlah hari di antara keduanya. Positif jika akhir setelah awal, negatif jika sebelumnya.
DATEDIF (lama tapi banyak dipakai):
=DATEDIF(A1, B1, "D")
DATEDIF adalah fungsi legacy yang tidak terdokumentasi, diwarisi dari Lotus 1-2-3. Andal untuk selisih hari. Argumen "D" mengembalikan total hari; "M" mengembalikan bulan penuh; "Y" mengembalikan tahun penuh.
Hari kerja (kecuali akhir pekan)
// JavaScript
function workingDaysBetween(start, end) {
let count = 0;
const current = new Date(start);
const endDate = new Date(end);
while (current < endDate) {
const day = current.getDay();
if (day !== 0 && day !== 6) count++;
current.setDate(current.getDate() + 1);
}
return count;
}
# Python
from datetime import date, timedelta
def working_days_between(start: str, end: str) -> int:
d1, d2 = date.fromisoformat(start), date.fromisoformat(end)
count = 0
current = d1
while current < d2:
if current.weekday() < 5: # 0=Senin, 4=Jumat
count += 1
current += timedelta(days=1)
return count
Excel:
=NETWORKDAYS(A1, B1)
NETWORKDAYS mengecualikan akhir pekan secara otomatis dan opsional menerima rentang tanggal libur sebagai argumen ketiga.
Kenapa aritmetika tanggal bisa tricky
Daylight Saving Time — hari saat jam berubah memiliki 23 atau 25 jam. Jika kamu mengurangkan timestamp (bukan objek date), 365 hari terkadang terlihat seperti 364 hari dalam milidetik.
Timezone — new Date("2024-01-01") di JavaScript diparsing sebagai UTC tengah malam. Jika timezone lokalmu adalah UTC+7, tanggal itu masih 1 Januari, tapi jika UTC-5, tanggal itu sebenarnya 31 Desember secara lokal. Selalu tentukan timezone secara eksplisit atau gunakan tanggal UTC.
Tahun kabisat — 2024 memiliki 366 hari. Rentang "1 tahun" dimulai dari 1 Januari 2024 memiliki 366 hari, bukan 365.
Menggunakan library date khusus (date-fns, dateutil, pandas) menangani semua ini dengan benar. Pendekatan milidetik manual tetap berfungsi tapi membutuhkan trik Math.round() untuk keamanan DST.
Ringkasan
- JavaScript:
Math.round((d2 - d1) / 86400000)ataudifferenceInCalendarDaysdari date-fns. - Python:
(date2 - date1).days— tidak ada masalah DST dengan objekdate. - Excel:
=DAYS(B1, A1)atau=DATEDIF(A1, B1, "D"). - Untuk hari kerja saja:
NETWORKDAYSdi Excel; loop denganweekday() < 5di Python. - Gunakan
Math.round, bukanMath.floor, di JavaScript untuk menghindari masalah DST.