All Tools / Blog / Cara Menghitung Selisih Hari Antara Dua Tanggal

Cara Menghitung Selisih Hari Antara Dua Tanggal

3 min read

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.

Timezonenew 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) atau differenceInCalendarDays dari date-fns.
  • Python: (date2 - date1).days — tidak ada masalah DST dengan objek date.
  • Excel: =DAYS(B1, A1) atau =DATEDIF(A1, B1, "D").
  • Untuk hari kerja saja: NETWORKDAYS di Excel; loop dengan weekday() < 5 di Python.
  • Gunakan Math.round, bukan Math.floor, di JavaScript untuk menghindari masalah DST.