Holidays

Mexico Public Holidays Calculator

Mexico's official public holidays for any year, calculated live — including several deliberately shifted to always land on a Monday.

Mexico's own Monday-shift reform

A 2006 reform to Mexico's Federal Labor Law deliberately moved several holidays off their historical fixed dates and onto a specific Monday each year — Constitution Day (originally February 5) moved to the first Monday of February, Benito Juarez's Birthday (originally March 21) to the third Monday of March, and Revolution Day (originally November 20) to the third Monday of November. It's the same "guarantee a long weekend" logic behind Japan's Happy Monday System, arrived at independently.

What stayed fixed

Not every holiday was moved — Independence Day (September 16) and Christmas remain on their traditional fixed dates, since the reform specifically targeted holidays where the connection to a particular weekday mattered less than getting a reliable three-day weekend.

Related

Related tools

function nthWeekday(year, month, weekday, n){ if(n === -1){ const last = new Date(Date.UTC(year, month+1, 0)); let d = last.getUTCDate(); while(new Date(Date.UTC(year, month, d)).getUTCDay() !== weekday) d--; return new Date(Date.UTC(year, month, d)); } const first = new Date(Date.UTC(year, month, 1)); const offset = (weekday - first.getUTCDay() + 7) % 7; return new Date(Date.UTC(year, month, 1 + offset + (n-1)*7)); } function mexicoHolidays(year){ const raw = [ ['New Year\'s Day', new Date(Date.UTC(year,0,1))], ['Constitution Day (1st Monday of Feb)', nthWeekday(year,1,1,1)], ['Benito Juarez\'s Birthday (3rd Monday of Mar)', nthWeekday(year,2,1,3)], ['Labour Day', new Date(Date.UTC(year,4,1))], ['Independence Day', new Date(Date.UTC(year,8,16))], ['Revolution Day (3rd Monday of Nov)', nthWeekday(year,10,1,3)], ['Christmas Day', new Date(Date.UTC(year,11,25))], ]; return raw.map(([name,date]) => ({name, date})); } const now = new Date(); for(let y = now.getFullYear()-1; y <= now.getFullYear()+3; y++){ const opt = document.createElement('option'); opt.value = y; opt.textContent = y; if(y === now.getFullYear()) opt.selected = true; document.getElementById('hlYear').appendChild(opt); } const yearSelect = document.getElementById('hlYear'); const table = document.getElementById('hlTable'); function fmt(d){ return d.toLocaleDateString('en-US',{weekday:'short', month:'long', day:'numeric'}); } function render(){ const year = parseInt(yearSelect.value,10); const rows = mexicoHolidays(year); table.innerHTML = rows.map(r => `
${r.name}${fmt(r.date)}
`).join(''); } yearSelect.addEventListener('change', render); render();