All Tools / Blog / Como Calcular Dias Entre Duas Datas

Como Calcular Dias Entre Duas Datas

4 min read

Calcular o número de dias entre duas datas parece simples, mas cada linguagem lida com isso de forma um pouco diferente — e os casos extremos (horário de verão, fusos horários, anos bissextos) são a fonte de inúmeros bugs de um dia a mais ou a menos. Veja como fazer corretamente nas ferramentas que você provavelmente usa.

JavaScript

A abordagem mais limpa é parsear ambas as datas, subtrair e converter milissegundos em dias.

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 é ano bissexto)

console.log(daysBetween("2025-03-01", "2026-03-01"));
// 365

Math.round() em vez de Math.floor() lida com o caso extremo de 1 hora em torno das transições de horário de verão — sem isso, ocasionalmente você obteria 364 em vez de 365 para um intervalo de 365 dias que cruza uma fronteira de horário de verão.

Usando date-fns (recomendado para produção):

import { differenceInCalendarDays } from 'date-fns';

const days = differenceInCalendarDays(new Date('2024-12-31'), new Date('2024-01-01'));
console.log(days); // 365

differenceInCalendarDays conta as fronteiras de dias do calendário cruzadas, que é geralmente o que você quer para coisas como "dias desde o último login."

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

A subtração de datetime.date do Python retorna um objeto timedelta. O atributo .days fornece o número inteiro de dias — sem problemas de horário de verão porque objetos date não têm componente de fuso horário.

Para datetimes com fuso horário:

from datetime import datetime, timezone

def days_between_aware(dt1: str, dt2: str) -> int:
    # ISO 8601 com informação de fuso horário
    d1 = datetime.fromisoformat(dt1)
    d2 = datetime.fromisoformat(dt2)
    return abs((d2 - d1).days)

Excel

O Excel armazena datas como números de série (dias desde 1 de janeiro de 1900), então a subtração é apenas aritmética.

Subtração simples:

=B1 - A1

Se A1 é 2024-01-01 e B1 é 2024-12-31, o resultado é 365. Certifique-se de que a célula está formatada como número, não como data — caso contrário o Excel exibe o resultado como uma data.

Função DAYS (mais clara):

=DAYS(B1, A1)

DAYS(data_fim, data_início) retorna o número de dias entre elas. Positivo se o fim for depois do início, negativo se for antes.

DATEDIF (legado mas muito usado):

=DATEDIF(A1, B1, "D")

DATEDIF é uma função legada não documentada herdada do Lotus 1-2-3. É confiável para diferenças de dias. O argumento "D" retorna total de dias; "M" retorna meses completos; "Y" retorna anos completos.

Dias úteis (excluindo fins de semana)

// 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=Seg, 4=Sex
            count += 1
        current += timedelta(days=1)
    return count

Excel:

=NETWORKDAYS(A1, B1)

NETWORKDAYS exclui fins de semana automaticamente e opcionalmente aceita um intervalo de datas de feriados como terceiro argumento.

Por que o cálculo de datas é complicado

Horário de verão — o dia em que os relógios mudam tem 23 ou 25 horas. Se você está subtraindo timestamps (não objetos de data), 365 dias às vezes parecem 364 dias em milissegundos.

Fusos horáriosnew Date("2024-01-01") em JavaScript é interpretado como meia-noite UTC. Se o seu fuso horário local é UTC-5, isso é na verdade 31 de dezembro localmente. Sempre especifique o fuso horário explicitamente ou use datas UTC.

Anos bissextos — 2024 tem 366 dias. Um intervalo de "1 ano" começando em 1 de janeiro de 2024 tem 366 dias, não 365.

Usar bibliotecas específicas de data (date-fns, dateutil, pandas) lida com tudo isso corretamente. A abordagem manual de milissegundos funciona, mas requer o truque do Math.round() para segurança com horário de verão.

Pontos principais

  • JavaScript: Math.round((d2 - d1) / 86400000) ou differenceInCalendarDays do date-fns.
  • Python: (date2 - date1).days — sem problemas de horário de verão com objetos date.
  • Excel: =DAYS(B1, A1) ou =DATEDIF(A1, B1, "D").
  • Para apenas dias úteis: NETWORKDAYS no Excel; loop com weekday() < 5 no Python.
  • Use Math.round não Math.floor em JavaScript para sobreviver às transições de horário de verão.