México tiene 7 feriados nacionales obligatorios según el Artículo 74 de la Ley Federal del Trabajo. Tres de ellos no tienen fecha fija: la ley los trasladó al lunes más cercano a la fecha histórica. El problema es que la mayoría de los sistemas de nómina siguen usando las fechas originales — y eso está mal casi todos los años.
3
feriados con fecha móvil
Feb · Mar · Nov
≠
Feb 5, Mar 21, Nov 20
incorrectos en casi todos los años
LFT
Art. 74 reformado
Decreto de traslado a lunes
Los tres feriados flotantes
El decreto de traslado es claro: el primer lunes de febrero, el tercer lunes de marzo y el tercer lunes de noviembre. Las fechas históricas (5, 21 y 20) son solo el punto de referencia — no la fecha del feriado.
Feriados flotantes — comparación por año
Fecha hardcodeada vs. fecha real del lunes
| Feriado | Hardcodeado | 2024 | 2025 | 2026 | 2027 |
|---|---|---|---|---|---|
|
Día de la Constitución Primer lunes de febrero |
Feb 5 | Feb 5 ✓ | Feb 3 | Feb 2 | Feb 1 |
|
Natalicio Benito Juárez Tercer lunes de marzo |
Mar 21 | Mar 18 | Mar 17 | Mar 16 | Mar 15 |
|
Día de la Revolución Tercer lunes de noviembre |
Nov 20 | Nov 18 | Nov 17 | Nov 16 | Nov 15 |
✓ coincidencia · ámbar = fecha real distinta al hardcodeado · 2026 en negrita = año actual
En 2024, Constitución coincidió por accidente con Feb 5. Los otros dos nunca coinciden. En 2026 los tres están desplazados.
Qué pasa en la nómina cuando falla
El impacto no es solo administrativo. Tiene consecuencias legales y económicas concretas:
El sistema dice que Feb 5 es feriado
- → Empleado trabaja el 2 de febrero (feriado real) sin recibir pago por día festivo
- → Sistema no genera alerta de hora extra en día festivo
- → El 5 de febrero se registra como inasistencia si el empleado trabaja normalmente
- → El recibo de nómina tiene la fecha de descanso incorrecta
El cálculo de plazos también falla
- → "Entregar en 5 días hábiles desde Jan 28" da Feb 3 con el calendario correcto
- → Con el hardcodeado (Feb 5 = feriado) da Feb 4 — un día de diferencia
- → Finiquitos calculados sobre días incorrectos
- → Plazos de respuesta a IMSS con margen equivocado
El error con un ejemplo concreto
Partamos del caso más claro: calcular la fecha de entrega de un finiquito contando desde el 28 de enero de 2026, con 5 días hábiles de plazo.
# Con calendario correcto (feriado = Feb 2)
Jan 28 → día 1
Jan 29 → día 2
Jan 30 → día 3
Feb 2 → FERIADO, se salta
Feb 3 → día 4
Feb 4 → día 5 → resultado: 4 de febrero ✓
# Con hardcodeado (feriado = Feb 5)
Jan 28 → día 1
Jan 29 → día 2
Jan 30 → día 3
Feb 2 → día 4 (no sabe que es feriado)
Feb 3 → día 5 → resultado: 3 de febrero ✗
# Un día de diferencia en el plazo legal
Un día de diferencia en un finiquito puede ser la diferencia entre cumplir o no cumplir con el plazo que marca la Ley Federal del Trabajo.
La solución: consultar el calendario real por API
En lugar de mantener un archivo de fechas, la API devuelve los feriados reales de México para el año que consultes — incluyendo la fecha exacta del lunes flotante.
import os, requestsAPI_KEY = os.environ[“FERIADOS_API_KEY”] BASE = “https://api.feriados.io/v1” HDR = {“Authorization”: f”Bearer {API_KEY}“}
Obtener todos los feriados de México en 2026
r = requests.get(f”{BASE}/MX/holidays”, params={“year”: 2026}, headers=HDR) feriados = r.json()[“data”]
Imprimir los flotantes
flotantes = [“Constitución”, “Juárez”, “Revolución”] for f in feriados: if any(k in f[“name”] for k in flotantes): print(f”{f[‘date’]} {f[‘name’]}“)
2026-02-02 Día de la Constitución
2026-03-16 Natalicio de Benito Juárez
2026-11-16 Día de la Revolución Mexicana
Para calcular días hábiles descontando los feriados reales:
import os, requests, calendarAPI_KEY = os.environ[“FERIADOS_API_KEY”] BASE = “https://api.feriados.io/v1” HDR = {“Authorization”: f”Bearer {API_KEY}”}
def dias_habiles_mx(año, mes): ultimo = calendar.monthrange(año, mes)[1] r = requests.get( f”{BASE}/MX/business-days/between”, params={“from”: f”{año}-{mes:02d}-01”, “to”: f”{año}-{mes:02d}-{ultimo}”}, headers=HDR, ) return r.json()[“data”][“business_days”]
Meses con lunes flotante en 2026
print(f”Febrero : {dias_habiles_mx(2026, 2)} días hábiles”) # → 19 print(f”Marzo : {dias_habiles_mx(2026, 3)} días hábiles”) # → 22 print(f”Noviembre: {dias_habiles_mx(2026, 11)} días hábiles”) # → 20
Y para sumar días hábiles a una fecha — útil para plazos de finiquitos, respuestas al IMSS o fechas de entrega:
def fecha_limite(desde, dias_habiles):
r = requests.get(
f"{BASE}/MX/business-days/add",
params={"date": desde, "days": dias_habiles},
headers=HDR,
)
return r.json()["data"]["result_date"]
Finiquito con 5 días hábiles desde el 28 de enero
plazo = fecha_limite(“2026-01-28”, 5)
print(f”Fecha límite: {plazo}”)
→ 2026-02-04 (correcto, saltó el 2 de febrero)
Por qué no conviene calcular los lunes flotantes manualmente
Calcular el primer o tercer lunes de un mes no es complicado en código. El problema no es ese cálculo — es mantenerlo actualizado cuando el gobierno decreta un cambio. México agregó el Día de las Niñas y los Niños en 2022 como feriado obligatorio. En 2022 el Congreso discutió el Día del Maestro. Los decretos pueden llegar con días de aviso.
Con la API, cuando cambia un decreto, el dato se actualiza sin que toques tu código.
También aplica a estos casos
Sistemas de RRHH
- • Cálculo de días trabajados para nómina variable
- • Plazos para liquidaciones y finiquitos
- • Control de ausencias en días festivos reales
- • Reportes de productividad por días hábiles del mes
Sistemas de pagos y logística
- • Fechas de corte y facturación mensual
- • Plazos de entrega comprometidos al cliente
- • Dispersiones de nómina y pagos a proveedores
- • Plazos fiscales y declaraciones al SAT
Si tu sistema maneja nómina o plazos laborales en México, el plan Starter da acceso a business-days/between y business-days/add — los dos endpoints que resuelven este problema — con cobertura de los 11 países de LATAM.
Plan Starter — desde $9/mes
El calendario correcto, sin mantenerlo
Feriados reales de México y 10 países más. Los lunes flotantes calculados automáticamente cada año.