El último día hábil del mes no es siempre el 28, el 30 o el 31. Si ese día cae en fin de semana o en feriado, el último hábil es el viernes anterior — o el jueves, si el viernes también es feriado.
Esto importa en facturación, nóminas, cierres contables, cobranzas y cualquier proceso que opere en “fin de mes”.
Por qué no es trivial calcularlo
El caso simple: diciembre 2026. El 31 es jueves → último hábil es el 31. Fácil.
El caso complicado: agosto 2026 en Chile. El 31 es lunes. ¿Es hábil? Sí, en Chile el 31 de agosto no es feriado. Último hábil: 31.
Pero si agosto tuviera un feriado el lunes 31, el último hábil sería el viernes 28. Y si el viernes 28 también fuera feriado (hipotéticamente), sería el jueves 27.
En Colombia, el problema es peor: si el último día hábil “natural” fuera un feriado trasladado al lunes anterior por la Ley Emiliani, el cálculo requiere conocer las fechas reales de celebración de ese año.
El enfoque DIY y sus problemas
// ❌ Incorrecto: asume que el último día hábil es siempre el último viernes
function lastBusinessDay(year, month) {
const lastDay = new Date(year, month, 0); // último día del mes
const dayOfWeek = lastDay.getDay();
if (dayOfWeek === 0) lastDay.setDate(lastDay.getDate() - 2); // domingo → viernes
if (dayOfWeek === 6) lastDay.setDate(lastDay.getDate() - 1); // sábado → viernes
return lastDay.toISOString().split("T")[0];
}
Este código no considera feriados. Si el 30 de octubre es viernes pero es feriado, devuelve igual el 30.
// ❌ Todavía incorrecto: considera feriados pero de lista estática
const FERIADOS = new Set(["2026-10-30", ...]);
function lastBusinessDay(year, month, feriados) {
let date = new Date(year, month, 0);
while (date.getDay() === 0 || date.getDay() === 6 ||
feriados.has(date.toISOString().split("T")[0])) {
date.setDate(date.getDate() - 1);
}
return date.toISOString().split("T")[0];
}
Funciona si la lista es correcta y está actualizada. El problema conocido: no lo estará para siempre.
Usando el endpoint directamente
Con la API de feriados.io, el cálculo es un GET:
# Último día hábil de enero 2026 en Chile
curl "https://api.feriados.io/v1/CL/last-business-day?date=2026-01-15" \
-H "Authorization: Bearer frd_tu_key"
El parámetro date puede ser cualquier fecha dentro del mes que quieres consultar. La API devuelve el último día hábil de ese mes:
{
"success": true,
"data": {
"last_business_day": "2026-01-30"
},
"meta": { "country": "CL", "month": "2026-01" }
}
Ejemplos por país y mes crítico
const API = "https://api.feriados.io/v1";
const HEADERS = { "Authorization": "Bearer frd_tu_key" };
async function lastBusinessDay(country, year, month) {
const date = `${year}-${String(month).padStart(2, "0")}-15`;
const res = await fetch(
`${API}/${country}/last-business-day?date=${date}`,
{ headers: HEADERS }
);
const { data } = await res.json();
return data.last_business_day;
}
// Cierre contable de septiembre 2026 en Chile
const cierreCL = await lastBusinessDay("CL", 2026, 9);
// "2026-09-30" (miércoles, no hay feriado)
// Cierre de septiembre 2026 en Colombia
const cierreCO = await lastBusinessDay("CO", 2026, 9);
// "2026-09-30" (miércoles)
// Cierre de diciembre 2026 en México
const cierreMX = await lastBusinessDay("MX", 2026, 12);
// "2026-12-31" (jueves, Navidad es el 25)
Casos de uso reales
Facturación mensual: emitir las facturas del mes el último día hábil, no el día 30 o 31 fijo.
Liquidaciones de nómina: en Chile y Colombia, las liquidaciones de sueldo suelen pagarse el último día hábil del mes. Un error aquí genera multas.
Cortes de cobranza: muchos sistemas de cobranza cierran el ciclo el último hábil y reinician el siguiente día hábil del mes siguiente.
Cierres contables: los asientos de cierre deben registrarse el último día hábil. Hacerlo en fin de semana o feriado genera inconsistencias en los reportes.
Qué plan necesito
El endpoint /last-business-day requiere plan Starter, Team o Business. El plan Free incluye consulta de feriados y validación de día hábil, pero no los endpoints de lógica operativa.
Si solo necesitas saber si el último día del mes es hábil (sin que la API calcule cuál es), puedes combinar dos llamadas Free:
// Con plan Free: verificar si el último día del mes es hábil
async function isLastDayOfMonthBusinessDay(country, year, month) {
const lastDay = new Date(Date.UTC(year, month, 0)).toISOString().split("T")[0]; // UTC para evitar desfase por zona horaria
const res = await fetch(
`${API}/${country}/is-business-day?date=${lastDay}`,
{ headers: HEADERS }
);
const { data } = await res.json();
return { date: lastDay, isBusinessDay: data.is_business_day };
}
Para el cálculo completo hacia atrás hasta encontrar el último hábil, Team es el camino más directo.
→ Ver planes y activar API key →
Ver también: Calcular días hábiles en JavaScript → · Nómina y días hábiles por país → · Documentación del endpoint →